Externe JAR-Dateien in eine neue JAR-Datei einfügen, die mit Ant erstellt wurde

Gerade habe ich 'geerbt' ein Java-Projekt und kommen nicht aus einem Java-hintergrund, ich bin ein wenig verloren manchmal. Eclipse Debuggen und ausführen der Anwendung während der Entwicklung. Ich habe über Eclipse gelungen ist ein .jar-Datei 'includes' werden alle erforderlichen externen jars wie Log4J, xmlrpc-server, etc. Dieses große .jar kann dann erfolgreich ausgeführt werden mit:

java -jar myjar.jar

Mein Nächster Schritt ist zum automatisieren von builds mit Ant - (version 1.7.1), damit ich nicht mit Eclipse zu tun-builds und-Bereitstellung. Dies hat sich als eine Herausforderung aufgrund meiner mangelnden java-Kenntnissen. 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 die folgenden:

<?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 dann ausführen:
ant clean build-jar

und eine Datei namens seraph.jar ist in den java/bin/jar-Verzeichnis. Ich versuche dann zu laufen, diese jar-Datei mit dem folgenden Befehl:
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.

Vermute ich, dass ich etwas getan haben, unglaublich dumm in dem build.xml-Datei und verbrachte den besseren Teil von zwei Tagen versuchen Variationen der Konfiguration, leider ohne Erfolg. Jede Hilfe zu bekommen, diese Arbeit wird sehr geschätzt.

Oh, und tut mir Leid wenn ich einige wichtige Informationen mit. Dies ist meine erste mal hier in SO.

Kommentar zu dem Problem - Öffnen
Wenn ich du wäre würde ich die Verwendung von Maven 2 oder Maven 3 anstelle von Ant, aber es wäre auch eine Herausforderung sein. Kommentarautor: Paweł Dyda
Ich habe es geschafft zu fingure aus einem ok-Weg zu erreichen, was ich wollte. Siehe unten für details. Kommentarautor: Christopher

InformationsquelleAutor der Frage Christopher | 2010-09-22

Schreibe einen Kommentar