我想创建一个可自动执行的胖子(Shade插件),但也包含源代码,资源,测试以及可导入Eclipse的所有内容。
jar将是单文件可执行应用程序,它还以可导入的方式包含整个项目作为maven项目(在解压缩jar之后,我假设)。
另一个选项是生成的项目zip,其中包括基本级别的二进制分发。
有这样的事吗?
答案 0 :(得分:2)
可能的解决方案需要3个步骤:
maven-shade-plugin
创建项目的超级jar。此JAR将包含所有依赖项,并且可执行。maven-assembly-plugin
创建由项目源组成的副工件。此ZIP将包含pom.xml
以及src
下的所有来源。这可能是一种配置:
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<id>make-uberjar</id>
<goals>
<goal>shade</goal>
</goals>
<phase>package</phase>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>fully.classified.name.to.main.Class</mainClass>
</transformer>
</transformers>
<createDependencyReducedPom>false</createDependencyReducedPom>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>sources</id>
<goals>
<goal>single</goal>
</goals>
<phase>package</phase>
<configuration>
<descriptors>
<descriptor>src/main/assembly/assembly-sources.xml</descriptor>
</descriptors>
</configuration>
</execution>
<execution>
<id>final</id>
<goals>
<goal>single</goal>
</goals>
<phase>package</phase>
<configuration>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
这会配置maven-shade-plugin
的执行和maven-assembly-plugin
的执行。第一次执行将创建源ZIP。这将是assembly-sources.xml
程序集描述符文件:
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<id>sources</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${project.basedir}</directory>
<includes>
<include>pom.xml</include>
<include>src/**</include>
</includes>
</fileSet>
</fileSets>
</assembly>
它将pom.xml
和src
下的所有内容都包含在具有sources
分类器的ZIP中。
第二个assembly.xml
程序集描述符文件将是:
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<id>jar-with-sources</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<includes>
<include>${project.groupId}:${project.artifactId}:jar:${project.version}</include>
</includes>
<unpack>true</unpack>
</dependencySet>
<dependencySet>
<useProjectAttachments>true</useProjectAttachments>
<includes>
<include>${project.groupId}:${project.artifactId}:zip:sources:${project.version}</include>
</includes>
</dependencySet>
</dependencySets>
</assembly>
这会创建2 <dependencySet>
。第一个解包了着色的JAR(它替换了构建中该点的主要工件)。第二个只包含sources
ZIP附加工件;请注意,我们需要使用<useProjectAttachments>
来包含附加的来源ZIP。
当您运行mvn clean install
时,您将获得一个文件{finalName}-jar-with-sources.jar
,它将成为您想要的可执行JAR。它还将包含根文件夹中所有源的ZIP文件。
答案 1 :(得分:0)
我发现使用maven assembly-plugin可以让你最好地控制这些东西,无论是超级罐还是可安装的拉链。 shade插件适用于超级罐,但对于安装程序拉链或安装程序则不太好。 在过去,我还通过添加izpack插件来增强该功能,izpack插件创建了一个真正的安装程序,而不是使用程序集插件创建的可分发zip。
例如,使用assembly-plugin,您可以选择包含或排除某些文件资源。例如,当您想在使用IDE时使用配置文件时,会发生这种情况,但您确实希望在最终分发zip中将其排除,或者您希望包含稍微不同的文件。 当你想要生成一个rpm时也会发生同样的情况:汇编插件可以帮助你做好准备,以便首先准备rpm插件运行所需的内容。
程序集插件附带了各种设置,您可以在其xml配置文件中声明这些设置,并且已有详细记录。
答案 2 :(得分:0)
在大多数情况下,尝试将所有应用程序依赖项打包在一个 .jar
中是一个坏主意,主要是因为 .jars
不是设计为以这种方式使用的。事实上,它们可能包含 META-INF/
和其他可能相互冲突的特定于 jar 的文件。
当我必须构建可以从命令行运行的二进制发行版时,我使用 Assembly 插件,如 I've described in this post。如果您需要分发 GUI 应用程序或一键式、自包含的 Web 服务器,方法将非常相似。