2009-05-13 8 views
35

W poniższym zbiorze plik docelowy jar odnosi się do właściwości jar.class.path w manifeście path klasy. Cel kompilacji odnosi się do projektu.class.pathGenerowanie ścieżki klasy manifestu od <classpath> w Ant

Tutaj jest nadmiarowość, ponieważ jar.class.path i project.class.path są bardzo podobne. Muszą one być aktualizowane zarówno po dodaniu bibliotek, co może być uciążliwe, jeśli lista bibliotek jest bardzo długa. Czy istnieje lepszy sposób? Każde rozwiązanie musi być wieloplatformowe i zawsze używać względnych ścieżek.

Edycja:
Powinna generować ścieżkę klasy JAR z zestawu plików, a nie odwrotnie, więc mogę używać symboli wieloznacznych do np. dołącz wszystkie pliki JAR do katalogu.

<?xml version="1.0"?> 
<project name="Higgins" default="jar" basedir="."> 

    <property name="jar.class.path" value="lib/forms-1.2.0.jar lib/BrowserLauncher.jar"/> 

    <path id="project.class.path"> 
     <pathelement location="build"/> 
     <fileset dir="lib"> 
     <include name="forms-1.2.0.jar"/> 
     <include name="BrowserLauncher.jar"/> 
     </fileset> 
    </path> 

    <target name="prepare"> 
     <mkdir dir="build"/> 
    </target> 

    <target name="compile" depends="prepare" description="Compile core sources"> 
     <javac srcdir="src" 
       includes="**" 
       destdir="build" 
       debug="true" 
       source="1.5"> 
      <classpath refid="project.class.path"/> 
     </javac> 
    </target> 

    <target name="jar" depends="compile" description="Generates executable jar file"> 
     <jar jarfile="higgins.jar"> 
      <manifest> 
       <attribute name="Main-Class" value="nl.helixsoft.higgins.Main"/> 
       <attribute name="Class-Path" value="${jar.class.path}"/> 
      </manifest> 
      <fileset dir="build" includes="**/*.class"/>    
      <fileset dir="src" includes="**/*.properties"/>   
     </jar> 
    </target> 

</project> 

Odpowiedz

41

Zakładając, że Ant 1.7 lub wyższy, możesz użyć zadania manifestclasspath.

<path id="dep.runtime"> 
    <fileset dir="./lib"> 
     <include name="**/*.jar" /> 
    </fileset> 
</path> 
<property name="dep_cp" value="${toString:dep.runtime}" /> 

<target name="default"> 
    <manifestclasspath property="manifest_cp" jarfile="myjar.jar"> 
     <classpath refid="dep.runtime" /> 
    </manifestclasspath> 
    <echo message="Build Classpath: ${dep_cp}" /> 
    <echo message="Manifest Classpath: ${manifest_cp}" /> 
</target> 
+1

Działa to, ale tylko wtedy, gdy nie masz bezwzględnych ścieżek w ścieżce klas. Na przykład, jeśli używasz pakietu debian 'libhibernate3-java', który instaluje się w'/usr/share/java/hibernate3.jar' i włączasz go do swojej ścieżki klasy, zadanie anta manifestclasspath wyświetli błąd. Rozwiązanie Qianjigui nadal działa. – joscarsson

2

Jeśli chcesz po prostu wspólny podścieżkę współdzielony między dwoma (lub więcej) ścieżek, które jest łatwe do zrobienia:

<path id="lib.path> 
    <fileset dir="lib"> 
     <include name="forms-1.2.0.jar"/> 
     <include name="BrowserLauncher.jar"/> 
    </fileset> 
</path> 

<path id="project.class.path"> 
    <pathelement location="build"/> 
    <path refid="lib.path"/> 
</path> 

<property name="jar.class.path" refid="lib.path"/> 

EDIT Niestety, źle zrozumiałem pytanie. Spróbuj tego:

<property name="jar.class.path" value="lib/forms-1.2.0.jar lib/BrowserLauncher.jar"/> 

<path id="project.class.path"> 
    <pathelement location="build"/> 
    <fileset dir="." includes="${jar.class.path}"/> 
</path> 
+0

Nie, to jest nieprawidłowe. W tym przypadku wartość jar.class.path jest oddzielona dwukropkami zamiast spacjami, a co gorsza, używa pełnych ścieżek, co czyni go bezużytecznym dla manifestu jar. – amarillion

+0

Edytowana odpowiedź w odpowiedzi na komentarz. –

+0

Tak, to działa w podanym przykładzie. Ale naprawdę chciałbym zbudować ścieżkę klasy słoika z zestawu plików, a nie odwrotnie, więc mogę używać symboli wieloznacznych. – amarillion

1

Można użyć <pathconvert> przekonwertować ścieżkę (który może zawierać zestaw plików) do zwykłego sznurka. Będziesz prawdopodobnie trzeba <echo> ten ciąg do pliku, użyj jednej < zastąpić > lub <replaceregexp> posiekać wiodące bity ścieżce, wreszcie korzystać <loadFile> załadować manipulować ciąg do ostatecznego nieruchomości.

Realizacja pozostawiona jako ćwiczenie dla czytelnika.

+0

To działa. Użyłem tego rozwiązania w moich skryptach ant w pewnym momencie. Ale jest brudny. –

+0

Istotnie bałaganiarski. Naprawdę chciałbym zobaczyć działający przykład tego, który rozbija wiodące bity ścieżki w sposób międzyplatformowy ... – amarillion

39
<path id="build.classpath"> 
    <fileset dir="${basedir}"> 
    <include name="lib/*.jar"/> 
    </fileset> 
</path> 

<pathconvert property="manifest.classpath" pathsep=" "> 
    <path refid="build.classpath"/> 
    <mapper> 
    <chainedmapper> 
     <flattenmapper/> 
     <globmapper from="*.jar" to="lib/*.jar"/> 
    </chainedmapper> 
    </mapper> 
</pathconvert> 

<target depends="compile" name="buildjar"> 
    <jar jarfile="${basedir}/${test.jar}"> 
    <fileset dir="${build}" /> 
    <manifest> 
     <attribute name="Main-Class" value="com.mycompany.TestMain"/> 
     <attribute name="Class-Path" value="${manifest.classpath}"/> 
    </manifest> 
</jar> 
</target> 

W celu uzyskania dalszych informacji sprawdź this article.

+0

dziękuję, że to było bardzo pomocne! –

+0

Dlaczego ta odpowiedź nie jest akceptowana? To jest idealne i działa nawet z wieloma konwerterami ścieżek – ha9u63ar

Powiązane problemy