【问题标题】:maven zip uber-jar and shell scriptmaven zip uber-jar 和 shell 脚本
【发布时间】:2016-05-23 22:07:44
【问题描述】:

我希望 maven 将由 shade-plugin 创建的 uber-jar 和 all_files 目录中的 shell 脚本结合起来。

项目结构如下:

all_files/
    mvn_script.sh
    projB-shaded.jar

    maven_project/
        guide/
            parent-pom.xml
        projA/
            pom.xml
        projB/
            pom.xml

jar 是由 projectB 的 pom 文件生成的,然后放入最外层的文件夹中,准备好与 shell 脚本一起压缩。原因是为了让shell脚本可以调用jar文件来执行项目。

我希望其他程序员能够轻松解压缩文件并运行 shell 脚本而无需担心。而且我还需要让maven将脚本和jar打包在一起。我不确定如何在阴影插件中实现它。

注意:我不想使用 assembly-plugin,因为它不能很好地打包依赖的 jar。

<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>
          <minimizeJar>true</minimizeJar>
          <outputFile>../../guide/${project.artifactId}-${project.version}-shaded.jar</outputFile>
          <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
              <manifestEntries>
                <Main-Class>projB.classB</Main-Class>
              </manifestEntries>
            </transformer>
          </transformers>
        </configuration>
      </execution>
    </executions>
  </plugin>                    

【问题讨论】:

    标签: shell maven jar maven-assembly-plugin maven-shade-plugin


    【解决方案1】:

    您不想使用 maven-assembly-plugin 来创建 uber-jar。但是你会想用它来创建那个 ZIP。

    目前,您的maven-shade-plugin 绑定到package 阶段。您可以将该执行转移到prepare-package 阶段(因为它实际上准备了您的最终包装)添加绑定到package 阶段的maven-assembly-plugin 的执行。您的程序集将创建一个基于阴影 JAR 的 ZIP(由于阴影插件将被执行,该 JAR 将存在)和 shell 脚本。

    示例描述符如下:

    <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>your-id</id>
        <formats>
            <format>zip</format>
        </formats>
        <files>
            <file>
                <source>${project.build.directory}/projB-shaded.jar</source>
                <outputDirectory>/</outputDirectory>
            </file>
            <file>
                <source>/path/to/mvn_script.sh</source>
                <outputDirectory>/</outputDirectory>
            </file>
        </files>
    </assembly>
    

    使用以下 POM 配置:

    <plugin>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.4.3</version>
        <executions>
            <execution>
                <phase>prepare-package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
                <configuration>
                    <!-- current configuration -->
                </configuration>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.6</version>
        <executions>
            <execution>
                <id>assemble</id>
                <goals>
                    <goal>single</goal>
                </goals>
                <phase>package</phase>
                <configuration>
                    <descriptors>
                        <descriptor>/path/to/assembly.xml</descriptor>
                    </descriptors>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    根据Maven standard directory layout,程序集描述符的典型位置在src/assembly 下。

    【讨论】:

    • 如何将 projB-shaded.jar 和 mvn_script.sh 文件添加到单个 zip 文件中?
    • 在 prepare-package 中运行 shade 会导致它失败。它似乎必须在包中运行,还是有其他配置允许它更早运行?
    猜你喜欢
    • 2016-12-30
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 2015-09-24
    相关资源
    最近更新 更多