2009-07-27 12 views
20

Próbuję dokonać rearchitekcji mojej techniki kompilacji w celu tworzenia plików JAR Java, które zależą od wspólnych plików JAR. (GlazedLists, Apache Commons, itd.)Mrówka, pliki JAR i Ścieżka Klasy oh my

Wrzuciłem je wszystkie do {Java JRE dir}/lib/ext, aby były automatycznie widoczne przez JRE, ale to doprowadziło do problemów, takich jak nie pamiętanie, że potrzebuję rozpowszechniać określone pliki JAR, więc chciałbym się nauczyć być bardziej konkretnym.

Więc przeniosłem je wszystkie w katalogu c: \ appl \ Java \ common \, dodaje je do Eclipse zbudować ścieżkę, aand określono to w moim mrówek pliku:

<path id="javac_classpath"> 
    <fileset dir="${libDir}"> 
     <include name="*.jar"/> 
    </fileset> 
    <fileset dir="c:/appl/java/common"> 
     <include name="*.jar"/> 
    </fileset> 
</path> 

Mam Nagłówek manifestu Class-Path ustawiony na "." w moim zadaniu jar, ale to nie działa, nawet jeśli umieściłem odpowiednie pliki jar w tym samym katalogu, co plik jar aplikacji. Mogę dodać je wszystkie ręcznie, jeden po drugim, do nagłówka Class-Path, ale zastanawiam się, czy istnieje łatwiejszy sposób na poprawne skonfigurowanie nagłówka Class-Path?

Odpowiedz

36

To wszystko, czego potrzebujesz:

<path id="build-classpath"> 
    <fileset dir="${dist}/lib"> 
     <include name="*.jar"/> 
    </fileset> 
</path> 
<manifestclasspath property="lib.list" jarfile="${dist}/lib/myprog.jar"> 
    <classpath refid="build-classpath"/> 
</manifestclasspath> 
<jar jarfile="${dist}/lib/myprog.jar" 
    basedir="${build}" 
    includes="com/my/prog/**" > 
    <manifest> 
     <attribute name="Main-Class" value="com.my.prog.MyProg"/> 
     <attribute name="Class-Path" value="${lib.list}"/> 
    </manifest> 
</jar> 

Jak można prawdopodobnie zobaczyć, to zakłada, że ​​została skompilowana swoich klas Java i wyjście im ${build}. Zakłada także, że skopiowałeś swoje pliki JAR do ${dist}/lib.

Powiedziawszy, że warto byłoby zajrzeć do innych systemów kompilacji, które mają wbudowaną obsługę zależności, takich jak Maven i Gradle. Te inne systemy kompilacji już przemyślały wiele wspólnych struktur projektu i operacji kompilacji, więc nie musisz zapisywać wszystkiego w najdrobniejszych szczegółach.

+1

ahhhh ... tego właśnie szukałem. Doskonały! –

+0

Hmmm. Korekta: nie działa dla nowej wersji, ponieważ katalog $ {dist}/lib może jeszcze nie istnieć. Czy istnieje sposób na opóźnienie wykonania zadania ? –

+0

DOH! nieważne, umieściłem i w głównej części mojego pliku mrówek, po prostu naprawiłem to poprzez umieszczenie go w zadaniu jar. dzięki jeszcze raz!!!!! –

0

Katalogi Classpath domyślnie nie zawierają plików Jar z powodów bezpieczeństwa. Ktoś mógłby umieścić tam plik jar i mógł zostać załadowany, przesłaniając kod, bez twojej wiedzy. Wiem, że była dyskusja na temat dodania kolejnej flagi lub tokena kończącego, aby umożliwić dodawanie plików Jar do ścieżki klasy, ale jeśli moja pamięć służy, jest to przeznaczone dla wersji 7. Jednak w ostatniej części mogę się mylić.

0

Nagłówek manifestu ścieżki klas dla plików jar wymaga jawnej listy plików jar, które chcesz uwzględnić. Wyświetlanie katalogu w ścieżce klas oznacza, że ​​java będzie szukał plików .class w tym katalogu, a nie w plikach jarfiles.

4

Co chcesz to mapper. Flattenmapper jest prawdopodobnie najłatwiejszy, ale zasadniczo musisz utworzyć element ścieżki, który określa ścieżkę klasy, a następnie użyć przekształcenia pathconvert, aby przekształcić go w ciąg znaków, który może być zawarty w manifeście.

Edycja: można użyć obejmują zasady budowania element ścieżki, więc wszystko w katalogu kończąc słoiku byłoby **/*.jar

-1

Skoro jesteś w Ant, to prawdopodobnie nie chcesz, aby przełączyć, ale Maven jest bardzo dobry w identyfikowaniu wszystkich twoich zależności i ma kilka możliwości kopiowania lub łączenia twoich słoików lib w celu dystrybucji. Dla moich celów mam wtyczkę Mavena, która tworzy skrypt uruchamiania podczas kompilacji, co z kolei ustawia dla mnie ścieżkę klasy, więc nie muszę się o to martwić.

+0

Ivy jest dość mrówka zgodny sposób na zarządzanie zależnościach. –

3

Z wersją 1.7 i następną zadanie manifestclasspath jest drogą naprzód. Jeśli używasz wersji ant przed 1.7, zadanie manifestclasspath nie istnieje.

Poniżej przedstawiono ten sam rezultat: -

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

<pathconvert property="lib.list" pathsep=" "> 
    <path refid="build.classpath" /> 
    <mapper> 
     <chainedmapper> 
      <flattenmapper /> 
     </chainedmapper> 
    </mapper> 
</pathconvert> 

<target name="generate.jar"> 
    <jar destfile="${dist}/lib/myprog.jar"> 
     <manifest> 
      <attribute name="Main-Class" 
       value="com.mypackage.MyClass" /> 
      <attribute name="Class-Path" value="${manifest.classpath}" /> 
     </manifest> 
    </jar> 
</target> 
Powiązane problemy