Java 是否可以创建一个;优步;包含项目类和项目依赖项的jar,作为带有自定义清单文件的jar?
我正在尝试创建一个可执行的jar(使用maven),其中包含项目类及其依赖项,其中包含一个清单文件,其中包含主类的条目和指向jar根目录中打包的依赖项的类路径条目;大概是这样的: 清单文件: ..... Main-Class : com.acme.MainClass Class-Path : dependecy1.jar dependecy2.jar ..... ..... 主类:com.acme.MainClass 类路径:dependcy1.jar dependcy2.jar ..... 罐子: 罐根 |-- .... |--com/acme/./*.class |--dependcy1.jar `--dependecy2.jarJava 是否可以创建一个;优步;包含项目类和项目依赖项的jar,作为带有自定义清单文件的jar?,java,maven-2,build-process,maven-plugin,uberjar,Java,Maven 2,Build Process,Maven Plugin,Uberjar,我正在尝试创建一个可执行的jar(使用maven),其中包含项目类及其依赖项,其中包含一个清单文件,其中包含主类的条目和指向jar根目录中打包的依赖项的类路径条目;大概是这样的: 清单文件: ..... Main-Class : com.acme.MainClass Class-Path : dependecy1.jar dependecy2.jar ..... ..... 主类:com.acme.MainClass 类路径:dependcy1.jar dependcy2.jar ..... 罐
我使用maven jar插件来创建清单文件,使用maven shade插件来创建“uber”jar,但是依赖项被解包并作为类添加到我的jar中。我过去使用过FatJar
我创建了一个相对简单的应用程序,客户端希望双击一个可执行文件,让它正常工作。安装程序或依赖项是不可能的。Fatjar为我将Eclipse中的项目库和引用文件捆绑到一个数兆字节的可执行jar中。完美无瑕。事实上,我没有检查
maven shade插件(或任何其他插件)到底在做什么,因为maven 2内置了创建megajar或uberjar的所有功能。您只需将maven assembly插件与预定义的带有依赖项的jar
描述符一起使用即可
只需将此代码段添加到pom.xml
即可自定义清单:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>my.package.to.my.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/assembly/uberjar.xml</descriptor>
</descriptors>
<archive>
<manifest>
<mainClass>my.package.to.my.MainClass</mainClass>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
<!--
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
-->
</plugin>
但是,同样,这个描述符的默认行为是解压缩依赖项(比如maven shade插件)。老实说,我不明白为什么这是一个问题,但是,如果这真的不是您想要的,您可以使用您自己的自定义程序集描述符
为此,首先,使用以下内容创建程序集描述符,例如src/assembly/uberjar.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>
最后运行mvn assembly:assembly
生成您的uberjar
(可选)取消对executions
元素的注释,以绑定包
阶段上的程序集插件(并将程序集作为正常构建的一部分生成)。具有
如果是gradle以上的情况,可以提供帮助。请注意{project('')}
行中的,只有当当前项目依赖于其他子项目或模块时,才需要此项。这是Eclipse插件吗?如果是这样,我看不出它是如何回答这个问题的。OP要求一个专业的解决方案……你说得对,我误解了那部分。我想我在想,它可以应用到其他领域,因为所有的IDE都不过是脚本包装的包装。我可以想象,一些软件生产商,特别是操作系统以外的软件生产商,可能会禁止“反汇编/逆向工程”他们的产品,或者坚持按原样维护他们的包装,包括文件名等。assembly:assembly最近已被assembly:single取代。(我使用的是汇编插件版本2.3)汇编插件是一个插件,就像shade插件一样,所以它不是“内置的”,我也有同样的问题。我想用eclipse构建Maven项目。我的问题是:在哪个文件中以及在哪里保存以下内容:``org.apache.maven.plugins maven assembly plugin…-->``我还试图生成uberjar.xml
文件;它必须介于之间
在pom.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>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>src/assembly/uberjar.xml</descriptor>
</descriptors>
<archive>
<manifest>
<mainClass>my.package.to.my.MainClass</mainClass>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
<!--
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
-->
</plugin>
task uberJar(type: Jar) {
manifest {
attributes 'Main-Class': 'main.RunTest'
}
dependsOn configurations.runtimeClasspath
from sourceSets.main.output
from sourceSets.test.output
from sourceSets.main.resources
from sourceSets.test.resources
from {
configurations.runtimeClasspath.findAll { it.name.endsWith('jar') }.collect { zipTree(it) }
}
from {
project(':someothermoudule').sourceSets.main.resources // If current project depends on some other modules
project(':someothermoudule').sourceSets.test.resources // If current project depends on some other modules
}
exclude 'META-INF/*.RSA'
exclude 'META-INF/*.SF'
exclude 'META-INF/*.DSA'
}