2009-11-18 10 views
18

Próbujemy zbudować słoik klienta, który zawiera niezakompresowanych słoików zależnych od. I manifest powinien mieć class-path wpisy do zależnych słoików. Poniższy fragment działa, ale słoiki są rozpakowywane - jak zatrzymać słoiki przed rozpakowaniem?Maven - Włączanie zależnych bibliotek w słoiku bez rozpakowywania zależności?

 <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 

      <configuration> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 

       <archive> 
        <manifest> 
        <addClasspath>true</addClasspath> 
        </manifest> 
       </archive> 
      </configuration> 

      <executions> 
       <execution> 
        <id>make-assembly</id> 
        <phase>package</phase> 
        <goals> 
         <goal>single</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

Odpowiedz

18

istocie, montaż za pomocą jar-with-dependencies przyczyny maven rozpakować wszystkie zależności jako ${assembly.dependencySets.dependency.unpack} jest ustawiony true w odpowiednim deskryptora montażu.

prosty fix byłoby zapewnienie deskryptor zespołu podobnego do jar-with-dependencies.xml i modyfikować ${assembly.dependencySets.dependency.unpack} do false, tak:

EDIT: z nieznanego powodu, zachowanie podczas wykorzystaniem <unpack>false</unpack> nie jest dokładnie taka sama i wydaje się konieczne dodanie <outputDirectory>/</outputDirectory> do fileSet lub nie otrzymasz oczekiwanego wyniku.

<assembly> 
    <id>uberjar</id> 
    <formats> 
    <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
    <dependencySet> 
     <unpack>false</unpack> 
     <scope>runtime</scope> 
    </dependencySet> 
    </dependencySets> 
    <fileSets> 
    <fileSet> 
     <directory>${project.build.outputDirectory}</directory> 
     <outputDirectory>/</outputDirectory> 
    </fileSet> 
    </fileSets> 
</assembly> 
+1

Dodałabym również ' false. – yegor256

3

Rozwiązanie zaproponowane przez Pascala Thiventa definiuje nowy zestaw dla wtyczki zespołu Maven. Wtyczka do instalacji Maven oferuje zestawienia domyślne, które są "bin", "jar-with-dependencies", "project" i "src" produkujące różne predefiniowane pakiety.

Nowy zestaw musi zostać zdefiniowany w nowym pliku xml, najczęściej w src/assemble. Następnie zostanie on załadowany zamiast jednego predefiniowanego, w ten sposób:

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2-beta-5</version> 
     <configuration> 

      <!-- disabled predefined assembly --> 
      <!-- 
      <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
      --> 

      <descriptors> 
      <descriptor>src/assemble/myAssembly.xml</descriptor> 
      </descriptors> 
     </configuration> 
</plugin> 
3

Możesz dodać zależności, jak pliki jar do słoika:

montaż-descriptor.xml

<assembly> 
    <id>uberjar</id> 
    <formats> 
     <format>jar</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <dependencySets> 
     <dependencySet> 
      <unpack>false</unpack> 
      <scope>runtime</scope> 
      <useProjectArtifact>false</useProjectArtifact> 
     </dependencySet> 
    </dependencySets> 
    <fileSets> 
     <fileSet> 
      <directory>${project.build.outputDirectory}</directory> 
      <outputDirectory>.</outputDirectory> 
     </fileSet> 
    </fileSets> 
</assembly> 

pom.xml

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.6</version> 
    <executions> 
     <execution> 
      <id>make-uberjar</id> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      <configuration> 
       <descriptor>src/main/assemble/assembly-descriptor.xml</descriptor> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

Ale niestety nie można użyć nagłówka Class-Path w manifest.mf patrz Adding Classes to the JAR File's Classpath:

UWAGA: The Class-Path punktów nagłówka do klas lub plików JAR w sieci lokalnej, a nie pliki JAR w pliku JAR lub klasy dostępne za pośrednictwem protokołów internetowych. Aby załadować klasy w plikach JAR w pliku JAR do ścieżki klasy, należy napisać niestandardowy kod, aby załadować te klasy. Jeśli na przykład MyJar.jar zawiera inny plik JAR o nazwie MyUtils.jar, nie można użyć nagłówka Class-Path w manifeście MyJar.jar's do załadowania klas w klasie MyUtils.jar do ścieżki klasy.

Powiązane problemy