Java 是否可以创建一个;优步;包含项目类和项目依赖项的jar,作为带有自定义清单文件的jar?

Java 是否可以创建一个;优步;包含项目类和项目依赖项的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 ..... 罐

我正在尝试创建一个可执行的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.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'
}