Maven 可以重新签署依赖项吗?

Posted

技术标签:

【中文标题】Maven 可以重新签署依赖项吗?【英文标题】:Can Maven re-sign dependencies? 【发布时间】:2014-01-09 17:12:17 【问题描述】:

我正在使用maven-jarsigner-plugin 签署我的一个带阴影的 uber-jar。不过,我确实需要在他们自己的 jar 中分发一些依赖项,并希望从 Maven 存储库中获取这些 jar,清除它们的任何现有签名,并使用我自己的证书对其进行签名。

是否有任何 Maven 插件可以做到这一点,或者我会涉及一些 Ant 插件黑客?

【问题讨论】:

你有没有看过如何接受签名而不是辞职?这是每个 jar 提供者的一次性操作。 【参考方案1】:

原来maven-jarsigner-plugin 可以使用它的removeExistingSignatures 配置元素重新对现有的 jar 进行签名。这么简单!

我在generate-resources 阶段使用maven-dependency-plugin 将工件复制到.war 项目中,然后在process-resources 阶段对它们进行签名。

<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>

【讨论】:

【参考方案2】:

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

复制依赖maven-dependency-plugin antrun&lt;unzip&gt; 他们,从 /META-INF 目录中删除除 MANIFEST.MF、&lt;jar&gt; 之外的所有内容,并使用 &lt;jarsign&gt; ant 任务再次对其进行签名。

自从我使用 maven(最近我承认)以来,我发现的主要问题是它让您通过其预定义的管道,而这种事情(这比看起来更常见)会让您需要一些你称之为蚂蚁黑客;)

【讨论】:

谢谢 - 你是对的,这是我想避免的那种解决方案,但它会是一个很好的后备方案,我很感激你花时间写它!【参考方案3】:

从未使用过它,但似乎 webstart-maven-plugin 可以取消签名和签名 jar。

http://mojo.codehaus.org/webstart/webstart-maven-plugin/unsign-mojo.html

希望对您有所帮助。

【讨论】:

【参考方案4】:

使用 maven:

为每个要辞职的 jar 创建一个空的 maven jar 模块,对其中一个 jar 执行 maven dependency:unpack,过滤签名文件并将文件复制到 src/main/java。

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

另一种非 Maven 基础:

上述方式不能很好地扩展,创建一个遵循these steps的脚本可能会更简单。

最简单的方法是:

考虑在您的 maven 存储库中注册签名者的公钥,而不是对 jars 进行签名,这意味着您信任创建这些 jars 的人并接受来自他们的任何 jars。

事实上,您已经信任他们,因为您正在使用他们的代码并对其进行签名,因此配置存储库以接受他们的签名会更简单,就像 已经配置存储库一样由某人接受您的签名

存储库链接到包含接受的 jar 签名者的公钥的密钥存储,这将是要求处理存储库的团队在他们的受信任签名者列表中再添加一个密钥,他们会知道如何一定要这样做。

【讨论】:

感谢您的想法。这些是用作小程序的 jar,因此 Maven 存储库方法很遗憾行不通。

以上是关于Maven 可以重新签署依赖项吗?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在 selenium 中添加驱动程序作为 maven 依赖项吗

我可以使用 Apache Felix Maven Bundle Plugin 声明像私有包这样的依赖项吗?

maven 会自动下载工件依赖项吗?

为 javax.persistence 编写 Maven 依赖项

maven不仅可以签名生成的jar,还可以签名依赖

我们可以将变量添加为不属于 useEffect 的依赖项吗?