3

有一个 maven 模块,比如 prj-package-module,可以使用 maven-assembly-plugin 将项目工件打包成 tar 文件。在 prj-package-module/pom.xml 中还添加了 jar 作为依赖项并打包到 tar 文件中。

现在的要求是在打包到 tar 文件之前将文件 prj-pakacge-module/src/main/resources/file.xml 添加到这些依赖项 jar 之一。我怎样才能做到这一点?

编辑:该文件是一个 JNLP,其中动态添加了依赖 jar 列表。出于安全原因,Javaws 还要求在 JNLP 文件中添加一个 jar 并对该 jar 进行签名。这就是我遇到问题的地方。

4

2 回答 2

5

这是一个 maven 解决方案,用于动态解压缩现有依赖项,将资源添加(复制)到解压缩的文件夹,重新打包(jar)漏洞,并因此获得初始 jar 的修改副本。

一个示例 pom 文件完全针对junit依赖项执行此操作:

<build>
    <plugins>
        <!-- unpack step -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.10</version>
            <executions>
                <execution>
                    <id>unpack</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>unpack</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>junit</groupId>
                                <artifactId>junit</artifactId>
                                <version>4.11</version>
                                <type>jar</type>
                                <outputDirectory>${project.build.directory}/unpack-tmp</outputDirectory>
                                <includes>**/*.class,**/*.xml</includes>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <!-- add the additional resource step -->
        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.7</version>
            <executions>
                <execution>
                    <id>copy-resources</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${basedir}/target/unpack-tmp</outputDirectory>
                        <resources>
                            <resource>
                                <directory>src/main/resources</directory>
                                <include>test.properties</include>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <!-- repack step -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.6</version>
            <executions>
                <execution>
                    <id>repack</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <classesDirectory>${basedir}/target/unpack-tmp</classesDirectory>
                        <finalName>junit-modified</finalName>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

它实际上在做什么:

运行上面的示例,该junit-modified.jar文件将出现在targetmaven 项目的文件夹中。

上述插件配置的顺序对于将步骤流程视为同一阶段的一部分非常重要。

然后,您有一个额外的文件要添加到您的 fat-jar 中,这确实是您可能正在寻找的修改后的 jar。


如果您不需要动态方法,更好的方法是执行一次并拥有该依赖项的分类版本,如其他 SO 帖子中所述。

或者,将其移至Maven 配置文件,以便至少它不是默认构建的一部分。

于 2016-02-04T15:26:54.670 回答
0

您似乎正在尝试修改 maven 项目的依赖项,然后再将其打包到项目的最终工件中。这是狡猾的。如果该 jar/库(依赖项)是您的,则修改该 jar 的 pom,重建它,然后让当前项目解析最新的工件。

否则,如果依赖项 jar 不是您的,那么在当前项目(您现在正在构建的项目)中拥有资源(prj-pakacge-module/src/main/resources/file.xml)就足够了,因为最终结果将是相同的(只要将程序集插件设置为展平目标 uber/fat jar 中的所有工件 jar...

于 2016-02-04T14:57:34.560 回答