java - Maven 插件创建可执行 jar 与未解压的依赖项 (jar with jars)

标签 java jar dependencies executable

我阅读了很多构建具有依赖项的可执行 jar 的解决方案(maven 阴影插件、maven 依赖项插件、maven 程序集插件)和所有这些插件解压依赖项 jar 并将它们重新打包到可执行 jar 中。唯一将解压到可执行 jar 中的依赖 jar 打包的插件是一个 jar 插件,但该插件将其运行器代码添加到可执行 jar 中。

是否有任何解决方案可以像这样创建 jar:

├─executable.jar
├──lib/
├───dependency1.jar
├───dependency2.jar
.
.
.

并且该解决方案有效。

最佳答案

最常见的方法是使用 assembly 插件,它允许您以您需要的方式配置打包

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
         <archive>
              <manifest>
                   <mainClass>com.somewhere.Main</mainClass>
              </manifest>
         </archive>
         <descriptorRefs>
              <descriptorRef>jar-with-dependencies</descriptorRef>
         </descriptorRefs>
    </configuration>
    <executions>
          <execution>
               <id>make-assembly</id>
               <phase>package</phase>
               <goals>
                    <goal>single</goal>
               </goals>
         </execution>
    </executions>
</plugin>

也可以为配置指定程序集描述符

<configuration>
    <appendAssemblyId>false</appendAssemblyId>
    <descriptors>
      <descriptor>src/main/assembly/assembly.xml</descriptor>
    </descriptors>
</configuration>

和 assembly.xml 本身

<assembly>
    <id>assembly</id>
    <formats>
         <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
        <fileSet>
             <directory>${project.build.outputDirectory}</directory>
             <outputDirectory>/</outputDirectory>
        </fileSet>
    </fileSets>
</assembly>

程序集描述符还可以包含依赖部分:

<!-- lib -->
<dependencySets>
    <dependencySet>
        <outputDirectory>lib</outputDirectory>
    </dependencySet>
</dependencySets>

据我了解,您正在寻找最后一个。因为它只是将 jar 文件包含到程序集中而没有进行任何修改。所以最终的解决方案将是这样的:

<assembly>
    <id>assembly</id>
    <formats>
         <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <!-- lib -->
    <dependencySets>
        <dependencySet>
             <outputDirectory>lib</outputDirectory>
        </dependencySet>
    </dependencySets>
</assembly>

和pom部分:

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <appendAssemblyId>false</appendAssemblyId>
        <descriptors>
             <descriptor>src/main/assembly/assembly.xml</descriptor>
        </descriptors>
    </configuration>
    <executions>
          <execution>
               <id>make-assembly</id>
               <phase>package</phase>
               <goals>
                    <goal>single</goal>
               </goals>
         </execution>
    </executions>
</plugin>

关于java - Maven 插件创建可执行 jar 与未解压的依赖项 (jar with jars),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17674784/

相关文章:

java - 父面板未正确重绘

java - jar文件名形式java代码

java - 使用 netbeans 创建 maven 项目的 jar 文件

java - 是什么阻止 Java 使用多种签名算法验证签名的 jar

android - 混合版本会导致 Firebase 中的运行时崩溃吗?

java - 重写java中类的静态 block

java - 如何在 Java EE 和 Spring Boot 中热重载属性?

perl - 如何伪造 perl 模块以进行依赖?

linux - 用于递归检查和选择依赖项的脚本

java - android.view.InflateException : Binary XML <Unknown>, 和 OutOfMemoryError?