2017-11-26 2 views
1

Mit Maven habe ich mein Projekt in eine JAR kompiliert, die alle Abhängigkeiten mit Ausnahme einer großen Abhängigkeit enthält. Die Einbeziehung der dependecies erfolgt mit:Ausführen einer ausführbaren JAR mit externem Klassenpfad

<plugin> 
<artifactId>maven-assembly-plugin</artifactId> 
<version>2.2.1</version> 
<configuration> 
    <archive> 
     <manifest> 
     <mainClass>com.mypackage.Main</mainClass> 
     </manifest> 
    </archive> 
    <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
    </descriptorRefs> 
</configuration> 
<executions> 
    <execution> 
     <id>make-assembly</id> 
     <phase>package</phase> 
     <goals> 
      <goal>single</goal> 
     </goals> 
    </execution> 
</executions> 

Ausschluss von Abhängigkeiten erfolgt mit <scope>provided</scope>

Das Ziel myjar.jar im selben Ordner wie BigExternalJar.jar ist, aber wenn ich laufen versuchen:

java -cp ".:BigExternalJar.jar:myjar.jar" -jar myjar.jar 

Ich bekomme eine Ausnahme für fehlende Klassen (diese Klassen sind von BigExternalJar.jar).

Wie kann man Abhängigkeiten in ein JAR, mit Maven nur packen, aber immer noch in der Lage sein, zusätzliche JARs im Klassenpfad hinzuzufügen? Beachten Sie, dass sich die BigExternalJar nicht immer im selben Ordner befindet, sodass ich sie nicht manuell zur MANIFEST-Datei hinzufügen kann.

Es gibt zwei ähnliche Fragen, die doppelt aussehen könnten, aber sie haben keine Antwort auf diese Situation. Eclipse: How to build an executable jar with external jar? UND Running a executable JAR with external dependencies

+0

Sie nicht verwenden; Klassenpfadeinträge (statt :) trennen? –

+0

'java -cp ... com.mypackage.Main'. -jar bedeutet: Ignoriere -cp, verwende Klassenpfad, der im Manifest angegeben wurde. –

+0

@ JBNizet Danke. Wenn dem so ist, schließe ich aus Ihrem Kommentar, dass es nicht möglich ist, einige Abhängigkeiten innerhalb eines Jars zu haben, und dann einen zusätzlichen Klassenpfad hinzuzufügen, wenn er ausgeführt wird. Richtig? –

Antwort

0

Das Classpath Argument, wenn Sie die -jar Option ignoriert. Nur der im Manifest angegebene Klassenpfad wird verwendet.

0
<build> 
    <plugins> 
     <!-- compiler插件, 设定JDK版本 --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
       <encoding>UTF-8</encoding> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <createDependencyReducedPom>false</createDependencyReducedPom> 
         <transformers> 
          <transformer 
            implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
           <mainClass>xxx.xxx.yourmain</mainClass> 
          </transformer> 
          <transformer 
            implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
           <resource>META-INF/spring.handlers</resource> 
          </transformer> 
          <transformer 
            implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
           <resource>META-INF/spring.schemas</resource> 
          </transformer> 
         </transformers> 
         <filters> 
          <filter> 
           <artifact>*:*</artifact> 
           <excludes> 
            <exclude>META-INF/*.SF</exclude> 
            <exclude>META-INF/*.DSA</exclude> 
            <exclude>META-INF/*.RSA</exclude> 
           </excludes> 
          </filter> 
         </filters> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

pls versuchen, diese ~~~ alle externen jar in Ihrem verpackt Glas sein

Verwandte Themen