Ho appena "ereditato" un progetto Java e non proviene da uno sfondo Java. Sono un po 'perso a volte. Eclipse viene utilizzato per eseguire il debug e l'esecuzione dell'applicazione durante lo sviluppo. Ho attraverso Eclipse riusciti a creare un .jar-file 'include' tutti i vasi esterni necessari come Log4J, XMLRPC server, ecc Questo grande .jar può quindi essere eseguito con successo utilizzando:Inclusione di file jar esterni in una nuova build di file jar con Ant
java -jar myjar.jar
Il mio prossimo passo è quello di automatizzare le build usando Ant (versione 1.7.1), quindi non devo coinvolgere Eclipse per fare build e deployment. Ciò ha dimostrato di essere una sfida a causa della mia mancanza di conoscenza della java. La radice del progetto è simile al seguente:
|-> 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!)
mio build.xml contiene quanto segue:
<?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>
ho quindi eseguire: ant clean accumulo vaso
e un serafino file chiamato .jar si trova nella directory java/bin/jar. Allora provo a eseguire questo barattolo con il seguente comando: java-jar bin/jar/seraph.jar
Il risultato è questa uscita alla console:
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.
Ho il sospetto che ho fatto qualcosa incredibilmente stupido nel file build.xml e hanno trascorso la maggior parte dei due giorni a provare variazioni sulla configurazione, senza alcun risultato. Ogni aiuto su come ottenere questo lavoro è molto apprezzato.
Oh, e mi dispiace se ho lasciato fuori alcune informazioni cruciali. Questa è la mia prima pubblicazione qui a SO.
Se fossi in te avrei usato Maven 2 o Maven 3 invece di formica, ma sarebbe anche una sfida. –
Sono riuscito a fingere un modo ok per realizzare ciò che volevo. Vedi sotto per i dettagli. – Christopher