0

maven-jarsigner-plugin用来签署一些 webstart jar:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jarsigner-plugin</artifactId>
    <version>1.4</version>
    <executions>
        <execution>
            <phase>package</phase>
            <id>sign</id>
            <goals>
                <goal>sign</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <keystore>key/mystore.jks</keystore>
        <alias>myalias</alias>
        <storepass>aBc.d:efg,H#ij^k?L</storepass>
    </configuration>
</plugin>

问题似乎是 storepass 中的特殊字符。当我在 Windows 上时,提供如上所示的 storepass 会导致以下错误:

Failed executing 'cmd.exe /X /C "D:\SOFT\JDK8\jre\..\bin\jarsigner.exe ...

当我运行底层 jarsigner 命令时:

jarsigner.exe -keystore D:\path\to\mystore.jks -storepass aBc.d:efg,H#ij^k?LD:\path\to\project\target\webstarts.jar myalias

我收到类似的错误,但是当我将 storepass 用引号括起来时,它可以工作。所以我回到我pom.xml的里面,把商店通行证放在引号里:

<storepass>"aBc.d:efg,H#ij^k?L"</storepass>

它奏效了。不幸的是,当我在我的构建服务器(Linux)上运行相同的构建时,引号不起作用——它只能在没有引号的情况下起作用。所以我试图将 storepass 文字完全从 pom 中取出并做类似的事情

<storepass>${jks.storepass}</storepass>

接着

mvn clean package -Djks.storepass=aBc.d:efg,H#ij^k?L

但这在 Windows 上不管有没有引号都不起作用。

我正在寻找一种解决方案,它支持带有特殊字符的 storepass,并且可以在 Windows 和 Linux 上使用相同的 pom。当我们有一个没有特殊字符(如“changeme”)的商店通行证时,一切正常并且不需要引号。

4

1 回答 1

0

You can leverage profile and activation per OS to use quotes on Windows and not on Linux. For example:

<profiles>
    <profile>
        <activation>
            <os>
                <family>windows</family>
            </os>
        </activation>
        <properties>
            <jks.storepass>"my?^#pass"</jks.storepass>
        </properties>
    </profile>
    <profile>
        <activation>
            <os>
                <family>unix</family>
            </os>
        </activation>
        <properties>
            <jks.storepass>my?^#pass</jks.storepass>
        </properties>
    </profile>
</profiles>

...

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jarsigner-plugin</artifactId>
    <version>1.4</version>
    <executions>
        <execution>
            <phase>package</phase>
            <id>sign</id>
            <goals>
                <goal>sign</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <keystore>key/mystore.jks</keystore>
        <alias>myalias</alias>
        <storepass>${jks.storepass}</storepass>
    </configuration>
</plugin>

If you want to run your build on other OS families, you may want to specify a profile for each of them. Available OS families and names are documented in the Enforcer plugin.

于 2017-12-02T14:13:40.353 回答