Ant: Jaką wartość Class-Path ustawić dla takiego JARa

0

Witam

Na początku chciałem zaznaczyć, że próbowałem szukać rozwiązania mojego problemu na różnych forach,
ale nic co udało mi się znaleźć nie działało w moim przypadku.

Mój problem jest następujący: Piszę projekt w Javie i chciałbym zapisać rozwiązanie w postaci pojedynczego archiwum JAR. Mój projekt korzysta z kilku zewnętrznych bibliotek a kompilację wykonuję za pomocą Ant'a.
(To jest pierwszy projekt jaki kompiluję przy użyciu Anta, więc proszę o wyrozumiałość).

Na chwilę obecną umiem stworzyć JARa, który można uruchomić jedynie wtedy, gdy w katalogu go zawierającym znajdują się wspomniane już biblioteki.
Umiem też wrzucić te dodatkowe biblioteki JAR do wynikowego archiwum, ale nie umiem ustawić atrybutu Class-Path tak, aby wskazywał biblioteki zawarte w uruchamianym archiwum JAR.

Poniżej prezentuję fragment mojego pliku build.xml .

    <path id="classpath">
        <fileset dir="${lib.dir}">
        	<include name="${cup.jar}" />
    		<include name="${commons.jar}" />
        </fileset>
    	<fileset dir="${res.dir}">
			<include name="${predef}" />
		</fileset>
    </path>
	
	
	<manifestclasspath property="lib.list"
			jarfile="${jar.dir}/${ant.project.name}.jar">
		<classpath refid="classpath" />	
	</manifestclasspath>
	
	
    <target name="jar" depends="compile">
        <mkdir dir="${jar.dir}" />
        <jar jarfile="${jar.dir}/${ant.project.name}.jar" basedir="${bin.dir}">
            <manifest>
                <attribute name="Main-Class" value="${main-class}" />
                <attribute name="Class-Path" value="${lib.list}" />
            </manifest>
        </jar>
        <copy todir="${jar.dir}">
            <fileset dir="${lib.dir}" includes="${cup.jar}" />
        	<fileset dir="${lib.dir}" includes="${commons.jar}" />
        	<fileset dir="${res.dir}" includes="${predef}" />
        </copy>
    </target>

Powyższy kod powoduje tylko stworzenie wynikowego JARa np. MyProject.jar , który w Manifest ma ustawione

Main-Class: com.mypkg.Main
Class-Path: ../lib/commons-lang3-3.1.jar ../lib/java-cup-11a.jar ../res/PredefinedFunctions.j

Byłbym bardzo wdzięczny za pomoc w napisaniu przykładowego pliku build.xml dla takiego uproszczonego przypadku:
Główny katalog zawiera:
build.xml
/src - Powiedzmy, że jedyny plik źródłowy to /src/com/mypkg/Main.java
/bin - Jedyny plik po skompilowaniu /bin/com/mypkg/Main.class
/lib - Zawiera 2 pliki /lib/ext1.jar i /lib/ext2.jar
/jar - W tym katalogu chciałbym zapisać wynikowe archiwum MyProject.jar o następującej strukturze:
+ META-INF
- MANIFEST.MF (Class-Path ustawione na te pliki ext?.jar)
+ com
+ mypkg
- Main.class
- ext1.jar
- ext2.jar

Życzę Wesołych Świąt i z góry dziękuję za pomoc.

Aquagen

1

Java sama w sobie nie pozwala na zawieranie jarow w jarach, najczesciej korzysta sie z repakowania - rozpakowuje sie wszystki liby, i pakuje do jednego jara. Ten sposob ma ten minus ze gdy pewne pliki sa powtarzane, ostatni wygrywa - np. mozna miec tylko 1 META-INF/MANIFEST.MF, ktory pewnie powinien zawierac w sobie atrybuty z wszystkich pozostalych (np. podpisane pliki) lub wybiorczo (Main-Class). To jest latwo zrobic w ancie rozpakowujac jary, a nastepnie pakujac je wszystkie do jednego jara.
Jest tez jakie cos jak Jar Jar Links: http://code.google.com/p/jarjar/. Tam pakowane sa jary do jara, ale uzywana jest tez magia generowania bytecodu aby java mogla takie klasy odnalezc. Ogolnie nie lubie osobiscie tego rozwiazania.

0

Bardzo dziękuję za wyczerpującą informację użytkowniku mućka.

Dużo czasu straciłem na (jak się okazało skazane na niepowodzenie) próby ustawienia tego Class-Path,
ponieważ samo wstawienie biblioteki Jar do ostatecznego Jara niestety się powiodło.

Jeszcze raz dziękuję

1 użytkowników online, w tym zalogowanych: 0, gości: 1