Java Maven可以重新签名依赖项吗?

Java Maven可以重新签名依赖项吗?,java,maven,applet,jar-signing,signed-applet,Java,Maven,Applet,Jar Signing,Signed Applet,我正在使用maven jarsigner插件为我的一个带阴影的uber罐子签名。不过,我确实需要在它们自己的JAR中分发一些依赖项,并希望从Maven repo中获取这些JAR,清除它们的任何现有签名,然后用我自己的证书对它们进行签名 有没有Maven插件可以做到这一点,或者我会使用一些Ant插件黑客?我知道这不是一个很好的答案,但我会在以下步骤中尝试解决方案: 通过maven依赖插件复制依赖项 antrun:将它们从/META-INF目录中除去MANIFEST.MF以外的所有内容,再次使用a

我正在使用
maven jarsigner插件
为我的一个带阴影的uber罐子签名。不过,我确实需要在它们自己的JAR中分发一些依赖项,并希望从Maven repo中获取这些JAR,清除它们的任何现有签名,然后用我自己的证书对它们进行签名


有没有Maven插件可以做到这一点,或者我会使用一些Ant插件黑客?

我知道这不是一个很好的答案,但我会在以下步骤中尝试解决方案:

  • 通过
    maven依赖插件复制依赖项
  • antrun
    将它们从/META-INF目录中除去MANIFEST.MF以外的所有内容,
    再次使用
    ant任务对它们进行签名

自从我与maven合作以来(最近我承认),我发现的主要问题是,它让你通过预定义的管道,而这类事情(比看起来更常见)会让你需要一些你称之为ant hackery的东西;)

从未使用过它,但webstart maven插件似乎可以对JAR进行取消签名和签名


希望对您有所帮助。

使用maven:

为每个要退出的jar创建一个空的maven jar模块,对其中一个jar执行maven操作,过滤签名文件并将文件复制到src/main/java

然后用
maven-jarsigned-plugin
对jar进行签名,结果将是一个包含相同类的jar

另一种基于非maven的选择:

上面的方法不能很好地扩展,创建下面的脚本可能会更简单

最简单的方法是:

<> P>而不是放弃jar,考虑在Maven存储库中注册签名者的公钥,这意味着您信任创建这些jar的人并接受来自它们的任何jar。 事实上,您已经信任他们了,因为您正在使用他们的代码并将其重新命名,因此将存储库配置为接受他们的签名会更简单,就像有人已将存储库配置为接受您的签名一样


存储库链接到一个包含已接受jar签名者公钥的密钥存储库,这将是一个要求处理存储库的团队向其受信任签名者列表中再添加一个密钥的问题,他们肯定知道怎么做。

事实证明,
maven jarsigner插件
可以使用它的
removeExistingSignatures
配置元素对现有JAR进行重新签名。太简单了

我使用
maven依赖插件
生成资源
阶段将工件复制到.war项目中,然后在
流程资源
阶段对它们进行签名

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.8</version>
    <executions>
        <execution>
            <id>copy</id>
            <phase>generate-resources</phase>
            <goals>
                <goal>copy</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>org.lwjgl.lwjgl</groupId>
                        <artifactId>lwjgl-platform</artifactId>
                        <version>2.9.0</version>
                        <classifier>natives-osx</classifier>
                        <type>jar</type>
                        <overWrite>true</overWrite>
                        <outputDirectory>src/main/webapp/</outputDirectory>
                        <destFileName>lwjgl-platform-natives-osx.jar</destFileName>
                    </artifactItem>   
                </artifactItems>        
                <outputDirectory>src/main/webapp</outputDirectory>
                <overWriteReleases>true</overWriteReleases>
                <overWriteSnapshots>true</overWriteSnapshots>
            </configuration>
        </execution>
    </executions>
</plugin>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jarsigner-plugin</artifactId>
    <version>1.2</version>
    <executions>
        <execution>
            <id>sign</id>
            <phase>process-resources</phase>
        <goals>
            <goal>sign</goal>
            </goals>
    </execution>
    </executions>
    <configuration>
        <keystore>${basedir}/path/to/my.keystore</keystore>
        <alias>alias</alias>
        <storepass>password</storepass>
        <keypass>password</keypass>
        <verbose>true</verbose>
        <archiveDirectory>src/main/webapp/</archiveDirectory>
        <processMainArtifact>false</processMainArtifact>
        <removeExistingSignatures>true</removeExistingSignatures>
    </configuration>
</plugin>

org.apache.maven.plugins
maven依赖插件
2.8
复制
产生资源
复制
org.lwjgl.lwjgl
lwjgl平台
2.9.0
本地人osx
罐子
真的
src/main/webapp/
lwjgl-platform-natives-osx.jar
src/main/webapp
真的
真的
org.apache.maven.plugins
maven jarsigner插件
1.2
签名
过程资源
签名
${basedir}/path/to/my.keystore
别名
密码
密码
真的
src/main/webapp/
假的
真的

谢谢-你说得对,这是我想要避免的解决方案,但这将是一个很好的退路,我感谢你花时间编写它!你看过如何接受签名而不是辞职吗?这是每个jar提供者的一次性操作。感谢您的想法。这些JAR将用作小程序,因此Maven存储库方法很遗憾无法工作。