首页 文章

maven程序集插件:将文件添加到依赖jar中

提问于
浏览
2

有一个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中 . 我怎样才能做到这一点?

Edit :该文件是一个JNLP,其中包含动态添加的依赖项jar列表 . 出于安全原因,Javaws还要求在JNLP文件中添加jar和要签名的jar . 这是我遇到问题的地方 .

2 回答

  • 3

    这是一个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 文件将出现在maven项目的 target 文件夹中 .

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

    然后,你有一个额外的文件要添加到你的胖 jar ,这确实是你可能正在寻找的改良 jar .


    如果您不需要动态方法,更好的方法是执行一次,并具有该依赖关系的分类版本,如this other SO post中所述 .

    或者,将其移动到Maven profile,以便至少它不是默认构建的一部分 .

  • 0

    您似乎在尝试修改maven项目的依赖关系,然后将其打包到项目的最终工件中 . 这很狡猾 . 如果那个jar /库(依赖项)是你的,那么修改那个jar的pom,重建它,然后让当前项目解析最新的工件 .

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

相关问题