Einträge mit dem Tag: java

Regex of the day

String f = "C:\\Desktop\\Prozess\\asdf\\31​653_Firma XYZ.zip";
Pattern pattern = Pattern.compile(".*\\\\Prozess​\\\\(.*)\\\\.*");
Matcher matcher = pattern.matcher(f);
matcher.find();
System.out.println( matcher.group(1) ); // --> asdf

scp mit Maven und Ant

Ich setze mich gerade ein wenig mit Maven auseinander. Das gesetzte Ziel war eine .war Datei mittels scp auf einen Server zu kopieren.

Dazu benötigt man erst einmal das Ant-Plugin, welches ich in den <build> Teil der pom.xml integriert habe. So, dass beim Aufruf von Run As -> Maven install (ich nutze das m2eclipse Plugin) die neue .war Datei erzeugt und direkt auf den Zielserver kopiert wird.

<plugin>
<artifactid>maven-antrun-plugin</artifactid>
<executions>
<execution>
<id>install</id>
<phase>install</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<scp file="..\project\target\myWar.war" todir="user@server:/home/apache-tomcat-6.0.29/webapps" password="pw"/>
</tasks>
</configuration>
</execution>
</executions>
</plugin>

Allerdings weigerte sich ant beharrlich scp auszuführen, was an der fehlenden jsch Datei lag (vgl. failed to create task or type scp)

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.3:run (install) on project ScoreCards: An Ant BuildException has occured: Problem: failed to create task or type scp

Ich konnte das Problem jedoch beheben indem ich zusätzlich 2 dependencies eingebunden habe.

...
</executions>
<dependencies>
<dependency>
<groupId>ant</groupId>
<artifactId>ant-jsch</artifactId>
<version>1.6.5</version>
</dependency>
<dependency>
<groupId>jsch</groupId>
<artifactId>jsch</artifactId>
<version>0.1.25</version>
</dependency>
</dependencies>
</plugin>

Danach wurde der HostKey des Zielservers nicht akzeptiert.

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.3:run (install) on project ScoreCards: An Ant BuildException has occured: com.jcraft.jsch.JSchException: reject HostKey: server

Dies lies sich ganz einfach durch das Hinzufügen folgender Zeile in den scp Befehl lösen:
trust="true"

Was mich zum nächsten Problem brachte: Die Authentifizierung schlug fehl.

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.3:run (install) on project ScoreCards: An Ant BuildException has occured: com.jcraft.jsch.JSchException: Auth fail

In der Regel bedeutet das zwar, dass Username und/oder Passwort falsch sind. Aber in meinem Fall lag es am Server. In der
/etc/sshd/sshd_config
musste nur PasswordAuthentication yes eingetragen werden. Nach dem Neustart des SSH-Daemon lief dann alles wie am Schnürchen. :)
Übrigens kommt es bei dessen Neustart auf das jeweilige Betriebssystem an. Hier ein paar Beispiele:

Ubuntu Linux
/etc/init.d/ssh restart

Suse linux
/etc/rc.d/sshd restart

Solaris 10
svcadm disable ssh
svcadm enable ssh

Solaris 9 und früher
/etc/init.d/sshd stop
/etc/init.d/sshd start

Fedora und RedHat Linux
/sbin/service sshd restart

Abschließend noch einmal der fertige und funktionsfähige Eintrag in der pom.xml:

<plugin>
<artifactid>maven-antrun-plugin</artifactid>
<executions>
<execution>
<id>install</id>
<phase>install</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<scp file="..\project\target\myWar.war" todir="user@server:/home/apache-tomcat-6.0.29/webapps" password="pw" trusted="true"/>
</tasks>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>ant</groupId>
<artifactId>ant-jsch</artifactId>
<version>1.6.5</version>
</dependency>
<dependency>
<groupId>jsch</groupId>
<artifactId>jsch</artifactId>
<version>0.1.25</version>
</dependency>
</dependencies>
</plugin>

Mehr RAM für den Kater

Wenn der Tomcat Server mit der
java.lang.OutOfMemoryError: Java heap space
deutlich macht, dass er mehr Speicher benötigt, ist das ganz einfach zu bewerkstelligen.

Unter Windows mit dem Befehl:
set CATALINA_OPTS=-Xms1024m -Xmx1024m
Und unter Linux mit dem Befehl:
export CATALINA_OPTS="-Xms1024m -Xmx1024m"

m2eclipse

Ob Maven oder Ant muss sicherlich für den jeweiligen Fall entschieden werden. Allerdings bringt Maven in gewissen Bereichen einen Komfort, den Ant leider nicht bieten kann. Und selbstverständlich gibt es mit m2eclipse auch das entsprechende Plugin für die Eclipse Entwicklungsumgebung.
Nach der Installation wird man sofort darauf hingewiesen, dass man ggf. noch ein zwei Einstellungen vornehmen muss:

“The Maven Integration requires that Eclipse be running in a JDK, because a number of Maven core plugins are using jars from the JDK.
Please make sure the -vm option in eclipse.ini is pointing to a JDK and verify that Installed JRE’s are also using JDK installs.”

Dies bedeutet im Detail, dass zum einen in Eclipse unter -> Window -> Preferences -> Java -> Installed JREs ein entsprechender Java Development Kit (JDK) und keine Java Runtime Environment (JRE) eingetragen ist.
Und zum anderen, dass auch in der Datei eclipse.ini darauf verwiesen wird. Dies geschieht mittels des -vm Parameter und der entsprechenden Pfadangabe (z. B. C:/Java/jdk1.6.0_13/bin/javaw.exe), so dass die Datei am Ende circa so aussieht:

-vm
C:/Java/jdk1.6.0_13/bin/javaw.exe
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256M
-framework
plugins\org.eclipse.osgi_3.4.3.R34x_v20081215-1030.jar
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms40m
-Xmx512m

failed to create task or type scp

Da will man nichtsahnend seine build.xml ausführen und dann so etwas… scp, um das ganze auf seinen Apache Tomcat zu schieben, verweigert seinen Dienst und man erhält so eine Fehlermeldung:

C:\eclipse\workspaces\…\build.xml:
Problem: failed to create task or type scp

Cause: Could not load a dependent class com/jcraft/jsch/UserInfo
It is not enough to have Ant’s optional JARs
you need the JAR files that the optional tasks depend upon.
Ant’s optional task dependencies are listed in the manual.

Action: Determine what extra JAR files are needed, and place them in one of:
-C:\eclipse\installs\3.3\eclipse\plugins\org.apache.ant_1.7.0.v200706080842\lib
-C:\Documents and Settings\vdb\.ant\lib
-a directory added on the command line with the -lib argument

Do not panic, this is a common problem.
The commonest cause is a missing JAR.

This is not a bug; it is a configuration problem

Am besten gefällt mir daran das “Do not Panic…”. ;-) Und in der Tat ist das Problem schnell behoben. Man braucht nur die entsprechende jsch.jar (aktuell jsch-0.1.42.jar) für ant, welche man auf JCraft bekommt. Diese dann in das, in der Fehlermeldung angegebene lib-Verzeichnis kopiert und schon sollte alles funktionieren.

Und wenn nicht, dann stellt sich Eclipse nur ein bisschen doof an. Dann muss man die .jar noch zusätzlich im Eclipse unter -> Window -> Preferences -> Ant -> Runtime -> Classpath -> Ant Home Entries (Default) mittels -> Add External JARs… hinzufügen. Und schon klappt alles. :)