Mam plik Ant build.xml
, który działa dobrze w linii poleceń: kompiluje, buduje JAR i mogę wykonać główną metodę z JAR-a. Plik build.xml
odwołuje się do wielu bibliotek stron trzecich, które są rozproszone tu i tam. Podczas budowania JAR skrypt nie zawiera wszystkich bibliotek trzeciej strony w samym JAR. Zamiast tego umieszcza ich ścieżkę w manifeście JAR. Pomaga to utrzymać cienki i uporządkowany JAR.Używanie ścieżki klas Anta w Eclipse
Chciałbym móc edytować i debugować mój projekt w Eclipse, ale nie mogę znaleźć łatwego sposobu na zrobienie tego. Mogę zlecić projektowi użycie pliku Ant w celu zbudowania projektu i to wydaje się działać. Jednak Eclipse ma problemy z znalezieniem thirdparty bibliotekami, a więc Eclipse jest o dwa problemy:
- to pokazuje (w edytorze tekstu) wiele błędów kompilacji, ponieważ wiele klas są niezdefiniowane i
- nie może wykonać JAR.
mogę rozwiązać obu powyższych problemów przez określenie przez strony, w dwóch miejscach różnica (czyli ścieżka budować poprzez Properties->Java Build Path->Libraries
, a ścieżka klasy wykonanie poprzez Run Configurations->Classpath
), wszystkie biblioteki osób trzecich. Ale wygląda na to, że nie powinienem robić tego ręcznie, ponieważ wszystkie biblioteki stron trzecich są już wymienione w manifeście JAR. Co ja robię źle?
Oto mój build.xml
file:
<!-- Set global properties for this build -->
<property name="src" location="./src" />
<property name="build" location="./build"/>
<property name="dist" location="./dist"/>
<property name="logs" location="./logs"/>
<property name="docs" location="./docs"/>
<property name="jar" location="${dist}/dynamic_analyzer.jar"/>
<property name="lib" location="../../thirdparty/lib"/>
<property name="hive-util" location="../../hive-utils/dist"/>
<property name="hpdb" location="../../hive-db/hpdb/dist"/>
<property name="static" location="../../hive-backend/static_analyzer/dist"/>
<property name="mainclass" value="com.datawarellc.main.DynamicMain"/>
<path id="dep.runtime">
<fileset dir="${lib}" includes="**/*.jar"/>
<fileset dir="${hive-util}" includes="**/*.jar"/>
<fileset dir="${hpdb}" includes="**/*.jar"/>
<fileset dir="${static}" includes="**/*.jar"/>
</path>
<target name="clean">
<delete dir="${build}"/>
<delete dir="${dist}"/>
<delete dir="${docs}"/>
<delete dir="${logs}"/>
</target>
<target name="init">
<tstamp/>
<mkdir dir="${build}"/>
<mkdir dir="${dist}"/>
<mkdir dir="${logs}"/>
</target>
<target name="compile" depends="init">
<javac srcdir="${src}" destdir="${build}" debug="on" includeantruntime="false">
<classpath refid="dep.runtime" />
</javac>
<!-- Debug output of classpath -->
<property name="myclasspath" refid="dep.runtime"/>
<echo message="Classpath = ${myclasspath}"/>
</target>
<target name="jar" depends="compile">
<!-- Put the classpath in the manifest -->
<manifestclasspath property="manifest_cp" jarfile="${jar}" maxParentLevels="10">
<classpath refid="dep.runtime" />
</manifestclasspath>
<jar jarfile="${jar}" basedir="${build}">
<manifest>
<attribute name="Main-Class" value="${mainclass}"/>
<attribute name="Class-Path" value="${manifest_cp}"/>
</manifest>
<zipfileset dir="${src}" includes="**/*.xml" />
</jar>
</target>
Widać, że mam bibliotek innych firm w kilku katalogach (${lib}
, ${hive-util}
, ${hpdb}
i ${static}
). Używam ich do utworzenia path
o nazwie dep.runtime
. Następnie włączam dep.runtime
do manifestu podczas budowania mojego słoika. Jak mogę zmusić Eclipse do używania tego samego dep.runtime
dla ścieżki budowania i ścieżki klasy podczas wykonywania?
Sprawdź dokumentację tutaj: http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Freference%2Fpreferences% 2Fjava% 2Fbuildpath% 2Fref-preferences-user-library.htm (Zrobiłbym to, ale nie mam instalacji Eclipse pod ręką) – leeand00
@ leeand00 Nie widzę, w jaki sposób ta dokumentacja pomaga mi. Menu, o którym mówi link, to właśnie menu, którego używam do ręcznego dodawania wszystkich bibliotek zewnętrznych (jako tymczasowe obejście), ale właśnie tego staram się unikać. – stepthom
Powinien być przycisk z napisem 'add directory' lub' add classpath', który powinien wystarczyć. Daj mi znać, jeśli nie. – leeand00