Java – Bitkorn Blog https://blog.bitkorn.de Developer Zeugz Sun, 30 Jul 2023 18:29:41 +0000 de-DE hourly 1 https://wordpress.org/?v=6.3.1 IntelliJ & Maven – Error:java: error: release version 5 not supported https://blog.bitkorn.de/intellij-maven-error-release-version-5-not-supported/ Wed, 26 Jun 2019 05:35:11 +0000 http://blog.bitkorn.de/?p=612 Project Structure => Project Settings => Project & Modules den richtigen language level. Folgender Code muss in die pom.xml: Danach kommt der Fehler immer noch. In IntelliJ rechts im Maven Tab den „Aktualisieren Button“ klicken und es […]]]> Im Messages: Build Tab kommt folgende Fehlermeldung:

Error:java: error: release version 5 not supported

Keine Auswirkung auf den Fehler, aber es braucht in File => Project Structure => Project Settings => Project & Modules den richtigen language level.

Folgender Code muss in die pom.xml:

<properties>
    <java.version>1.11</java.version>
    <maven.compiler.source>1.11</maven.compiler.source>
    <maven.compiler.target>1.11</maven.compiler.target>
</properties>

Danach kommt der Fehler immer noch. In IntelliJ rechts im Maven Tab den „Aktualisieren Button“ klicken und es funktioniert.

]]>
Log4j 2 https://blog.bitkorn.de/log4j-2/ Sun, 23 Jun 2019 08:27:20 +0000 http://blog.bitkorn.de/?p=609 Log4j downloaden

und auch Commons Logging.

Aus Log4j

  • log4j-1.2-api-2.11.1.jar
  • log4j-core-2.11.1.jar

und aus Commons Logging

  • commons-logging-1.2.jar

in das Projekt einbinden.

Dazu eine Datei log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <File name="MyFile" fileName="all.log" immediateFlush="false" append="false">
            <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    </Appenders>
    <Loggers>
<!--        <Root level="error">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="MyFile"/>
        </Root>-->
        <Root level="debug">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="MyFile"/>
        </Root>
<!--        <Root level="info">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="MyFile"/>
        </Root>-->
    </Loggers>
</Configuration>

Mit folgendem Java Code einen Logger erstellen:

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;

public class MyApplication {
    private static final Logger LOGGER = LogManager.getLogger(MyApplication.class);

    public static void main(String[] args) {
        LOGGER.info("Hello, World!");
    }
}
]]>
update-alternatives Java https://blog.bitkorn.de/update-alternatives-java/ Wed, 17 Apr 2019 09:50:56 +0000 http://blog.t-brieskorn.de/?p=584 Möchte man das Java JDK von Hand installieren sind drei Schritte notwendig:
1. Download Java SDK
2. Datei an den gewünschten Ort entpacken (hier /opt/Oracle_Java/)
3. die verschiedenen Programme als Alternativen in Linux fest legen

Für Punkt 3 habe ich ein kleines Skript geschrieben, das die neuen JDK Programme als Alternative installiert und setzt:

#!/bin/sh
sudo update-alternatives --install "/usr/bin/java" "java" "/opt/Oracle_Java/jdk1.8.0_172/bin/java" 1
sudo update-alternatives --install "/usr/bin/javac" "javac" "/opt/Oracle_Java/jdk1.8.0_172/bin/javac" 1
sudo update-alternatives --install "/usr/bin/jar" "jar" "/opt/Oracle_Java/jdk1.8.0_172/bin/jar" 1
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/opt/Oracle_Java/jdk1.8.0_172/bin/javaws" 1

sudo update-alternatives --set "java" "/opt/Oracle_Java/jdk1.8.0_172/bin/java"
sudo update-alternatives --set "javac" "/opt/Oracle_Java/jdk1.8.0_172/bin/javac"
sudo update-alternatives --set "jar" "/opt/Oracle_Java/jdk1.8.0_172/bin/jar"
sudo update-alternatives --set "javaws" "/opt/Oracle_Java/jdk1.8.0_172/bin/javaws"

# sudo update-alternatives --install "/usr/lib/mozilla/plugins/mozilla-javaplugin.so" "mozilla-javaplugin.so" "/opt/Oracle_Java/jdk1.8.0_172/jre/lib/amd64/libnpjp2.so" 1
# sudo update-alternatives --config mozilla-javaplugin.so

Weil das Skript schon etwas älter ist gibt es noch die Zeilen (auskommentiert) für das Browser Plugin.
Seit Java 11 gibt es javaws nicht mehr. Darum können die beiden Zeilen mit javaws für Java >= 11 auch weg.

Möchte man zurück zu einem anderen installiertem Java fürt man folgende Befehle aus:

sudo update-alternatives --config java
sudo update-alternatives --config javac
sudo update-alternatives --config jar

UbuntuUsers – Alternativen-System

]]>
generate Tomcat Eclipse VM arguments https://blog.bitkorn.de/generate-tomcat-eclipse-vm-arguments/ Fri, 20 Jul 2018 09:32:00 +0000 http://blog.t-brieskorn.de/?p=468 new -> Server zuerst angelegt werden. Dann findet man im Server Tab den Tomcat …auf diesen doppelt klicken. Dadurch öffnet sich […]]]> Bei den Run Configurations in Eclipse für den Tomcat (ich nutze aktuell die 8er Version) brauchts es VM arguments. Diese automatisch zu erstellen ist die einfachste Möglichkeit.

Dazu muss der Tomcat per File -> new -> Server zuerst angelegt werden.

Dann findet man im Server Tab den Tomcat …auf diesen doppelt klicken. Dadurch öffnet sich die Run Configuration mit einigen VM arguments.

]]>
Java EE, Tomcat & Eclipse https://blog.bitkorn.de/java-ee-tomcat-eclipse/ Sun, 24 Jun 2018 12:21:01 +0000 http://blog.t-brieskorn.de/?p=438 Wenn verwöhnte Netbeans User für Java EE Eclipse benutzen müssen, wirds kurz haarig 😉

catalina.base

Die Variable catalina.base in den Run Configuration des Tomcats setzen weil die Tomcat Datei catalina.properties sie zum Laden der libs benötigt.

Automatisch macht Eclipse z.B.:

-Dcatalina.base="/home/allapow/workspace-neon/.metadata/.plugins/org.eclipse.wst.server.core/tmp0" -Dcatalina.home="/home/allapow/Apps/Apache-Tomcat-8/apache-tomcat-8.0.52" -Dwtp.deploy="/home/allapow/workspace-neon/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps" -Djava.endorsed.dirs="/home/allapow/Apps/Apache-Tomcat-8/apache-tomcat-8.0.52/endorsed"

CATALINA_HOME

Falls man seinem Linux in /etc/profile (oder sonst wo) gesagt hat, wo CATALINA_HOME ist und man verschiedene Tomkatzen benutzt, dann kann man in Eclipse, in der Run Configuration jedes Tomcats, unter dem Tab „Environment“, CATALINA_HOME und eventuell auch CATALINA_BASE angeben.

Tomcat libs für REST

catalina-ws.jar kann man passend zum Tomcat auf der Apache Seite runter laden. Laut schlauen Leuten im Netz muss diese lib in den Tomcat lib/ Ordner. Bis jetzt funzt mein REST Service auch ohne …mal sehen wozu die gut ist.

Auch das ganze Jersey Zeug muss nicht in den lib/ Ordner des Tomcat. Denke, wenn es in der war Datei ist muss es nicht erneut im Tomcat lib/ Ordner. Im Projekt muss man die meisten haben, sonst werden Klassen nicht gefunden.

JAX-RS

Entgegen anderen Meinungen im Web müssen alle (Ordner: api/, ext/ & lib/) Lib-Jars aus Jersey in das Verzeichnis [ProjectName]/WebContent/WEB-INF/lib.

Und die web.xml sieht so aus

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	id="WebApp_ID" version="3.1">
	<display-name>LearnEclipseEE02</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
	<servlet>
		<servlet-name>Jersey REST Service</servlet-name>
		<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
		<!-- Register resources and providers under com.vogella.jersey.first package. -->
		<init-param>
			<param-name>jersey.config.server.provider.packages</param-name>
			<param-value>de.bitkorn.jersey.resource</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>Jersey REST Service</servlet-name>
		<url-pattern>/rest/*</url-pattern>
	</servlet-mapping>
</web-app>
]]>
iText font with effect https://blog.bitkorn.de/itext-font-with-effect/ Mon, 12 Dec 2016 09:54:34 +0000 http://blog.t-brieskorn.de/?p=224 TestDoc.java

package test;
nimport com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class TestDoc {

    private static final org.apache.log4j.Logger LOG4J = org.apache.log4j.Logger.getRootLogger();

    public void createPdf() {
        Document document = new Document(PageSize.A4);
        try {
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("/tmp/test.pdf"));
            writer.setPageEvent(new TestHeader());
            document.open();
            PdfContentByte canvas = writer.getDirectContent();
            ColumnText testColumn = new ColumnText(canvas);
            Phrase testPhrase = new Phrase();
            testPhrase.setFont(new Font(Font.FontFamily.HELVETICA, 18, Font.NORMAL, BaseColor.DARK_GRAY));
            testPhrase.add("testTextDoc"); // only after setFont(), setFont() has effect!!!
            testColumn.setSimpleColumn(testPhrase,
                    100, PageSize.A4.getHeight() - 200,
                    200, PageSize.A4.getHeight() - 160,
                    18, Element.ALIGN_LEFT);
            testColumn.go();

            document.close();
        } catch (DocumentException | FileNotFoundException ex) {
            LOG4J.error(ex.getMessage());
        }
    }
}

 

 

TestHeader.java

 

package test;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfWriter;

public class TestHeader extends PdfPageEventHelper {

    private static final org.apache.log4j.Logger LOG4J = org.apache.log4j.Logger.getRootLogger();

    @Override
    public void onStartPage(PdfWriter writer, Document document) {
        PdfContentByte canvas = writer.getDirectContent();
        ColumnText testColumn = new ColumnText(canvas);
        Phrase testPhrase = new Phrase();
        testPhrase.setFont(new Font(Font.FontFamily.HELVETICA, 6, Font.NORMAL, BaseColor.DARK_GRAY));
        testPhrase.add("testTextHeader"); // only after setFont(), setFont() has effect!!!
        testColumn.setSimpleColumn(testPhrase,
                100, PageSize.A4.getHeight() - 100,
                200, PageSize.A4.getHeight() - 60,
                6, Element.ALIGN_LEFT);

        try {
            testColumn.go();
        } catch (DocumentException ex) {
            LOG4J.error(ex.getMessage());
        }
    }
}

 

 

Es funzt wie in Grafiklibraries. Da setzt man die Farbe und kann anschließend etwas machen, das dann in der zuletzt gesetzten Farbe erstellt wird.

]]>
PdfPCell addElement() & setHorizontalAlignment() https://blog.bitkorn.de/pdfpcell-addelement-sethorizontalalignment/ Mon, 03 Oct 2016 08:15:18 +0000 http://blog.t-brieskorn.de/?p=205 Erstelle ich eine PdfPCell und füge mit addElement() beispielsweise eine Phrase hinzu, kann ich NICHT mit setHorizontalAlignment(Element.ALIGN_CENTER) die Ausrichtung des Inhalts bestimmen.\r\n

PdfPCell cell = new PdfPCell();\r\ncell.addElement(new Phrase("-"));\r\ncell.setHorizontalAlignment(Element.ALIGN_CENTER); // does not work\r\n

\r\n\r\nStattdessen muß man sich die Column holen:\r\n

PdfPCell cell = new PdfPCell();\r\ncell.getColumn().addText(new Phrase("-"));\r\ncell.setHorizontalAlignment(Element.ALIGN_CENTER); // OK\r\n

\r\n\r\nGuckt man sich den Source Code von PdfPCell bei Github an wird es deutlich. Die Methode addElement() fügt im obigen Beispiel das Element der PdfPCell hinzu. Wohingegen der Konstruktor es der Column hinzu fügt.\r\n\r\nDas funktionierende Beispiel oben, holt sich erst die Column aus der PdfPCell und packt dort die Phrase rein.\r\nDann in der Methode setHorizontalAlignment() wird der Column das Alignment gesetzt. Bedeutet, wenn man ein Element einfach mit addElement() hinzu fügt kann man es nicht horizontal ausrichten weil es nicht in der Column ist!

]]>
java.lang.OutOfMemoryError: Java heap space https://blog.bitkorn.de/java-lang-outofmemoryerror-java-heap-space/ Fri, 27 May 2016 10:08:26 +0000 http://blog.t-brieskorn.de/?p=164 Wieder mal die rekursiven Funktionen brauchen mehr Platz.\r\nDie Fehlermeldung

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space\r\n

nennt klar den heap als nicht ausreichend. Dieser (max) wird mit der VM Option

-Xmx<size>

fest gelegt.\r\n\r\nDie Seite Garbage Collector Ergonomics bei Oracle gibt nähere Infos. Demnach sind 64 MB default.\r\n\r\n

java -X

gibt Infos über die verschiedenen X-Optionen und am Ende die Übersichtsseite bei Oracle.\r\n

java -XshowSettings:vm

zeigt u.a. was default ist.

]]>
java.lang.StackOverflowError https://blog.bitkorn.de/java-lang-stackoverflowerror/ Thu, 31 Mar 2016 07:20:53 +0000 http://blog.t-brieskorn.de/?p=124 Run im Feld VM Options z.B. -Xss64m eintragen.]]> Bei mir passierte es bei sehr tiefen rekursiven Funktionsaufrufen.\r\n\r\nAbhilfe schafft:\r\n

\r\njava -jar -Xss64m example.jar\r\n

\r\n\r\nMit\r\n

\r\njava -X -help\r\n

\r\nsieht man die Hilfe zu den Optionen.\r\n\r\nEine IDE wie Netbeans kann man damit vorkonfigurieren. In den Project Properties in Build -> Run im Feld VM Options z.B. -Xss64m eintragen.

]]>
Email Validierung https://blog.bitkorn.de/email-validation/ Sat, 14 Mar 2015 14:01:47 +0000 http://blog.t-brieskorn.de/?p=4 Javamail (javax.mail.internet.InternetAddress) macht keine zuverlässige Emailvalidierung. Z.B. kann die TDL auch eine Zahl sein.\r\n\r\nhttp://www.mkyong.com/regular-expressions/how-to-validate-email-address-with-regular-expression/\r\n…ist auch nicht zuverlässig. Dort darf es mit Minus beginnen.\r\n\r\n…ich weiß …ich bin kleinlig\r\naber korrekter wäre wohl:\r\n

^[A-Za-z0-9]+[_A-Za-z0-9-]*[A-Za-z0-9]+(\\.[A-Za-z0-9]+[_A-Za-z0-9-]*[A-Za-z0-9]+)*@[A-Za-z0-9]+[_A-Za-z0-9-]*[A-Za-z0-9]+(\\.[A-Za-z0-9]+[_A-Za-z0-9-]*[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$

\r\nDoch dürften Minus und der Unterstrich immernoch mehrfach hintereinander kommen. Wenn es jedoch keine neuen Emailregistrierungen, sondern nur Emailadressen die zum Registrieren benutzt werden, überprüfen soll, soll es genug sein 🙂

]]>