【发布时间】:2016-02-22 11:59:49
【问题描述】:
我想使用没有第三方依赖的 maven-shade-plugin 创建一个 jar 文件。但是,应将第 3 方依赖项 jar 复制到某个文件夹(例如 libs)。 因此,当我分发我的应用程序时,我将 main.jar 和 libs 文件夹一起分发,所以当我启动创建的主 jar 时,它应该从 libs 文件夹加载依赖项。
是否可以在 maven-shade-plugin 中执行此操作?那么如何配置呢?
【问题讨论】:
我想使用没有第三方依赖的 maven-shade-plugin 创建一个 jar 文件。但是,应将第 3 方依赖项 jar 复制到某个文件夹(例如 libs)。 因此,当我分发我的应用程序时,我将 main.jar 和 libs 文件夹一起分发,所以当我启动创建的主 jar 时,它应该从 libs 文件夹加载依赖项。
是否可以在 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 shade插件搭建了一个大jar。
这是我在一个 jar 中构建一个包含所有 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 Assembly Plugin只提供了一些基本的支持,而Maven Shade Plugin可以提供更多的控制。
【讨论】: