Ich habe gerade ein Java-Projekt "geerbt", und da ich nicht aus dem Java-Umfeld komme, bin ich manchmal ein wenig verloren. Eclipse wird zum Debuggen und Ausführen der Anwendung während der Entwicklung verwendet. Mit Hilfe von Eclipse ist es mir gelungen, eine .jar-Datei zu erstellen, die alle erforderlichen externen Jars wie Log4J, xmlrpc-server usw. "enthält". Diese große .jar-Datei kann dann erfolgreich mit ausgeführt werden:
java -jar myjar.jar
Mein nächster Schritt besteht darin, Builds mit Ant (Version 1.7.1) zu automatisieren, damit ich Eclipse nicht für Builds und Deployment einsetzen muss. Dies hat sich aufgrund meiner mangelnden Java-Kenntnisse als Herausforderung erwiesen. Die Wurzel des Projekts sieht wie folgt aus:
|-> jars (where external jars have been placed)
|-> java
| |-> bin (where the finished .class / .jars are placed)
| |-> src (Where code lives)
| |-> ++files like build.xml etc
|-> sql (you guessed it; sql! )
Meine build.xml enthält das Folgende:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project basedir="." default="build" name="Seraph">
<property environment="env"/>
<property name="debuglevel" value="source,lines,vars"/>
<property name="target" value="1.6"/>
<property name="source" value="1.6"/>
<property name="build.dir" value="bin"/>
<property name="src.dir" value="src"/>
<property name="lib.dir" value="../jars"/>
<property name="classes.dir" value="${build.dir}/classes"/>
<property name="jar.dir" value="${build.dir}/jar"/>
<property name="jar.file" value="${jar.dir}/seraph.jar"/>
<property name="manifest.file" value="${jar.dir}/MANIFEST.MF"/>
<property name="main.class" value="no.easyconnect.seraph.core.SeraphCore"/>
<path id="external.jars">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>
<path id="project.classpath">
<pathelement location="${src.dir}"/>
<path refid="external.jars" />
</path>
<target name="init">
<mkdir dir="${build.dir}"/>
<mkdir dir="${classes.dir}"/>
<mkdir dir="${jar.dir}"/>
<copy includeemptydirs="false" todir="${build.dir}">
<fileset dir="${src.dir}">
<exclude name="**/*.launch"/>
<exclude name="**/*.java"/>
</fileset>
</copy>
</target>
<target name="clean">
<delete dir="${build.dir}"/>
</target>
<target name="cleanall" depends="clean"/>
<target name="build" depends="init">
<echo message="${ant.project.name}: ${ant.file}"/>
<javac debug="true" debuglevel="${debuglevel}" destdir="bin" source="${source}" target="${target}" classpathref="project.classpath">
<src path="${src.dir}"/>
</javac>
</target>
<target name="build-jar" depends="build">
<delete file="${jar.file}" />
<delete file="${manifest.file}" />
<manifest file="${manifest.file}" >
<attribute name="built-by" value="${user.name}" />
<attribute name="Main-Class" value="${main.class}" />
</manifest>
<jar destfile="${jar.file}"
basedir="${build.dir}"
manifest="${manifest.file}">
<fileset dir="${classes.dir}" includes="**/*.class" />
<fileset dir="${lib.dir}" includes="**/*.jar" />
</jar>
</target>
</project>
Ich laufe dann: ant clean build-jar
und eine Datei mit dem Namen seraph.jar wird im java/bin/jar-Verzeichnis abgelegt. Ich versuche dann, diese Jar-Datei mit dem folgenden Befehl auszuführen: java -jar bin/jar/seraph.jar
Das Ergebnis ist diese Ausgabe auf der Konsole:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Logger
at no.easyconnect.seraph.core.SeraphCore.<clinit>(SeraphCore.java:23)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 1 more
Could not find the main class: no.easyconnect.seraph.core.SeraphCore. Program will exit.
Ich vermute, dass ich etwas erstaunlich dummes in der build.xml-Datei gemacht habe und habe den größten Teil von zwei Tagen damit verbracht, Variationen der Konfiguration auszuprobieren, ohne Erfolg. Jede Hilfe auf immer diese Arbeit ist sehr geschätzt.
Oh, und es tut mir leid, wenn ich einige wichtige Informationen ausgelassen habe. Dies ist mein erster Beitrag hier bei SO.
0 Stimmen
An Ihrer Stelle würde ich Maven 2 oder Maven 3 anstelle von Ant verwenden, aber auch das wäre eine Herausforderung.
0 Stimmen
Ich habe es geschafft, einen guten Weg zu finden, um das zu erreichen, was ich wollte. Siehe unten für die Details.