我想使用maven-shade-plugin創建一個沒有第三方依賴關係的JAR文件。但是,第三方依賴jar應該被複制到某個文件夾(比如libs)。 因此,當我分發我的應用程序時,我將main.jar和libs文件夾分散在一起,因此當啓動創建的主jar時,它應該從libs文件夾加載依賴關係。Maven Shade插件創建無依賴關係的JAR並從其他位置加載依賴關係JAR
是否有可能在maven-shade-plugin中做到這一點?那麼如何配置呢?
我想使用maven-shade-plugin創建一個沒有第三方依賴關係的JAR文件。但是,第三方依賴jar應該被複制到某個文件夾(比如libs)。 因此,當我分發我的應用程序時,我將main.jar和libs文件夾分散在一起,因此當啓動創建的主jar時,它應該從libs文件夾加載依賴關係。Maven Shade插件創建無依賴關係的JAR並從其他位置加載依賴關係JAR
是否有可能在maven-shade-plugin中做到這一點?那麼如何配置呢?
這是不能實現的,因爲Maven shade插件將所有依賴jar文件內容(類文件)提取到主jar文件中。但是,這可以使用maven-jar-plugin
和maven-dependency-plugin
來實現。這是我的生成設置:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
當然,我也直接內置了一個大罐子基於Maven插件蔭。
這是我使用在一個罐子裏建立一個Spring應用程序在內的所有Spring框架的依賴:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<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>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.tooling</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>${project.build.mainClass}</Main-Class>
<Build-Number>1</Build-Number>
<Specification-Title>${project.artifactId}</Specification-Title>
<Specification-Version>${project.version}</Specification-Version>
<Implementation-Title>${project.artifactId}</Implementation-Title>
<Implementation-Version>${project.version}</Implementation-Version>
<Implementation-Vendor-Id>${project.groupId}</Implementation-Vendor-Id>
</manifestEntries>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
除了有關與Maven Assembly Plugin的比較,如HP所提到的,Maven的大會插件只提供一些基本的支持,但Maven Shade Plugin可以提供更多控制。
簡單回答號碼 – khmarbaise