2009-06-18 20 views
8

Często spotykam się z dystrybucją aplikacji lub bibliotek Java, które używają Mavena jako narzędzia do budowania.Java: Jak utworzyć samodzielne dystrybucje projektów opartych na Maven?

Niektóre z nich, niestety, nie zapewniają samodzielnych (lub redystrybucyjnych) słoików.

Czy możliwe jest tworzenie aplikacji opartych Maven w taki sposób, że build wynik zawiera wszystkie zależności i może być rozpowszechniany pracować out-of-the box?

Próbowałem zbudować moduł OCM Jackrabbit. Dla niektórych bardzo "inteligentnych" powodów nie ma wersji samodzielnej do pobrania .
Tak więc zbudowałem Jackrabbit z Mavenem (pakiet źródłowy programu Jackrabbit zawiera OCM) i otrzymałem ten sam słoik, który został znaleziony w apache repository. Słoik nie zawiera zawiera niezbędnych zależności i jest dla mnie bezużyteczny bezużyteczny.

+0

Zobacz moją odpowiedź na Maven Shade VS Assembly. Shade jest wyraźnym zwycięzcą. – opyate

+0

http://maven.apache.org/plugins/maven-assembly-plugin/descriptor-refs.html#jar-with-dependencies –

Odpowiedz

0

Zmień plik pom.xml i użyj dyrektywy <Embed-Dependency>. Podobny przykład można znaleźć pod numerem here, dzięki czemu można go dostosować do swojego scenariusza.

<Embed-Dependency>*;scope=!test;inline=true</Embed-Dependency> 

Myślę, że powinno to wystarczyć.


Oto przykład powyższego adresu URL, który wydaje się dawać limit czasu.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>br.gov.lexml</groupId> 
    <artifactId>toolkit</artifactId> 
    <packaging>bundle</packaging> 
    <version>3.0</version> 
    <parent> 
     <artifactId>lexml</artifactId> 
     <groupId>br.gov.lexml</groupId> 
     <version>1.0</version> 
    </parent> 
    <build> 
     <finalName>Lexml_Toolkit-2.0</finalName> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <configuration> 
        <source>1.5</source> 
        <target>1.5</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.felix</groupId> 
       <artifactId>maven-bundle-plugin</artifactId> 
       <extensions>true</extensions> 
       <configuration> 
        <instructions> 
         <!--_include>src/toolkit/resources/META-INF/MANIFEST.MF</_include--> 

         <Export-Package>*;-split-package:=merge-last</Export-Package> 
         <Bundle-Activator>br.gov.lexml.borda.Toolkit</Bundle-Activator> 
         <Bundle-Name>Toolkit</Bundle-Name> 
         <Private-Package /> 
         <Embed-Dependency>*;scope=!test;inline=true</Embed-Dependency> 
         <Bundle-ClassPath>.,{maven-dependencies}</Bundle-ClassPath> 
        </instructions> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 
    <dependencies> 
     <dependency> 
      <groupId>org.apache.xmlbeans</groupId> 
      <artifactId>xmlbeans</artifactId> 
      <version>2.4.0</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.xmlbeans</groupId> 
      <artifactId>xmlbeans-xmlpublic</artifactId> 
      <version>2.4.0</version> 
     </dependency> 
     <dependency> 
      <groupId>log4j</groupId> 
      <artifactId>log4j</artifactId> 
      <version>1.2.15</version> 
     </dependency> 
     <dependency> 
      <groupId>br.gov.lexmlbeans</groupId> 
      <artifactId>lexmlbeans</artifactId> 
      <version>3.0</version> 
     </dependency> 
    </dependencies> 
</project> 
+0

Twój link kończy się przekroczeniem limitu czasu. Proszę powiedz mi, gdzie umieścić dyrektywę. Nie mogę znaleźć przydatnych instrukcji w sieci. –

+0

Po prostu wkleiłem komentarze do dokumentu w odpowiedzi. Nadzieja, która pomaga. –

+0

Przepraszam, jestem zupełnie nowy dla maven i, szczerze mówiąc, nie chcę nawet głębiej w to wchodzić. Tak więc, nie wiem: 1) Czy muszę edytować główny pom.xml, czy też jeden z pożądanych modułów (który chcę zbudować jako pakiet redyst), 2) Aktywator pakietu wydaje się być czymś związane z twoim projektem, więc jak mógłbym go zmienić, żeby działał? Główny problem polega na tym, że robię wszystko zdalnie poprzez SSH, więc moja elastyczność próbowania rzeczy jest bardzo ograniczona. –

2

Może masz trochę szczęścia z . W przeciwnym razie spójrz na numer assembly plugin. To bardziej elastyczne, ale niższy poziom. Jeśli używasz wtyczki zespołu, możesz znaleźć rozdział na ten temat w maven: the definitive guide, aby był przydatny.

0

Wierzę, że Maven Shade Plugin zaspokoi Twoje potrzeby. Używam go, gdy buduję narzędzia interfejsu wiersza poleceń, aby utworzyć JAR Uber, w tym moje klasy i razem z klasami z wszystkich moich zależności.

Jest bardzo łatwy w użyciu i myślę, że to example jest oczywiste.

2

Jak powiedział Dominic, użycie wtyczki zespołu wystarczy. byś zwykle skonfigurować go wewnątrz POM swój projekt, aby zebrać i zapakować wszystkie wymagane zależności:

... 
    <plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <configuration> 
     <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
    </configuration> 
    </plugin> 
    ... 

jar-with-dependencies jest predefiniowany przez wtyczkę montażowej i obejmie wszystkie zależności w końcowym opakowaniu (patrz dokumentacja here).

Jeśli nie chcesz używać Mavena do własnego projektu, będziesz musiał zmodyfikować POM biblioteki i spakować je samodzielnie (pobierz źródła, dodaj powyższy fragment do pom.xml i uruchom mvn package). Uważaj na duplikaty lub niekompatybilne zależności przechodnie, jeśli korzystasz z wielu bibliotek. exclusions może pomóc w tym przypadku (patrz dokumentacja: here).

0

Jak napisano w kilku plakatach, wtyczka zespołu jest dobrym sposobem na stworzenie kompletnego pliku jar, ze wszystkimi zależnościami projektu. Jednak w rzeczywistości nie trzeba modyfikować pliku pom.xml. Po prostu uruchom:

mvn assembly:single -DdescriptorId=jar-with-dependencies 

... w celu utworzenia pliku jar. Jeśli chcesz zrobić coś bardziej zaawansowanego, prawdopodobnie zmodyfikuj pom.xml i utwórz niestandardowy deskryptor zespołu.

+0

'' 'assembly: single''' rozpakuje twoje pliki JAR zależności tak jak jest, a to nie może być to, czego chcesz. Na przykład. rzeczy takie jak '' 'META-INF/spring.schemas''' zostaną nadpisane przez ostatni JAR zależny od Spring, który jest oceniany, i jako takie twoje XSD-y nie zostaną znalezione (poza tymi w ostatnim JAR-ie, oczywiście). Właśnie dlatego systemy takie jak Alfresco stworzyły wtyczkę AMP, która łączy zależności wewnątrz '' 'lib /' '' wewnątrz tworzonego AMP. Ten ostatni jednak powoduje problemy z zarządzaniem zależnościami. – opyate

3

Użyj Maven Shade wtyczki

... ale uważaj na pułapek (podobnych do tych opisanych w dalszej mojej odpowiedzi), który ma a workaround explained here.

Bądź też bardzo ostrożny przy konfiguracji wtyczki Shade. Przypadkowo użyłem podwójnych tagów <configuration>, a transformatory w ogóle się nie zastosowały, a wtyczka również nie ostrzegała mnie.

Nie używaj Assembly Maven plugin

assembly:single rozpakuje swoje JAR zależnościami jak jest, i to nie może być to, co chcesz. Na przykład. rzeczy takie jak META-INF/spring.schemas zostaną nadpisane przez ostatnie JAR zależne od wiosny, które są oceniane, i jako takie twoje XSD-y nie zostaną znalezione (poza tymi w ostatnim JAR-ie, oczywiście). Właśnie dlatego systemy takie jak Alfresco stworzyły wtyczkę AMP, która łączy w sobie pakiety wewnątrz lib/ wewnątrz budowanego AMP. Ten ostatni jednak powoduje problemy z zarządzaniem zależnościami.

Powiązane problemy