【问题标题】:How to add 'all-permissions' to manifest file with Maven in combination with Webstart Maven plugin?如何使用 Maven 结合 Webstart Maven 插件向清单文件添加“所有权限”?
【发布时间】:2015-08-25 15:14:35
【问题描述】:

我最近开始尝试使用 Maven。作为测试,我正在尝试创建一个简单的 JavaFX8 webstart 应用程序。

为此,我使用了 Netbeans 8 中 Maven 类别下的 JavaFX 示例。这为我提供了一个简单的 HelloWorld 应用程序:

我在 pom.xml 文件中添加了一个名为“jnlp”的新配置文件。这样可以在构建项目时创建 JNLP 文件(使用 webstart maven 插件)。

....
<profiles>
    <profile>
        <id>jnlp</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>webstart-maven-plugin</artifactId>
                    <version>1.0-beta-6</version>
                    <dependencies>
                        <dependency>
                            <groupId>org.codehaus.mojo</groupId>
                            <artifactId>webstart-pack200-impl</artifactId>
                            <version>1.0-beta-6</version>
                        </dependency>
                        <dependency>
                            <groupId>org.codehaus.mojo</groupId>
                            <artifactId>keytool-api-1.7</artifactId>
                            <version>1.5</version>
                        </dependency>
                    </dependencies>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>jnlp</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <codebase>http://(my_url)/maven/</codebase> //replaced the url obviously :)
                        <jnlp>
                            <mainClass>com.mycompany.mavenprojecthelloworld.MainApp</mainClass>
                        </jnlp>
                        <pack200>
                            <enabled>false</enabled>
                        </pack200>
                        <sign>
                            <keystore>${project.basedir}/src/main/jnlp/mykeystore</keystore>
                            <keypass>mykeypass</keypass>
                            <storepass>mystorepass</storepass>
                            <alias>myalias</alias>
                            <verify>true</verify>
                        </sign>
                        <verbose>true</verbose>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

当我构建它时,它会在/target/jnlp 目录中生成一个 launch.jnlp 文件和一个 mavenprojectHelloWorld-1.0-SNAPSHOT.jar 文件。我仔细检查了 jarsigner 以检查我的 jar 文件是否正确签名。这是输出:

我将 launch.jnlpmavenprojectHelloWorld-1.0-SNAPSHOT.jar 文件复制到我的网络主机 (http://(my_url)/maven) 并通过启动 JNLP 文件启动 HelloWorld 应用程序.但是,当我这样做时,我会收到一条消息“Java 应用程序被阻止”窗口和一个“应用程序错误”:

Java 控制台告诉我以下信息:

java.lang.SecurityException: JAR manifest requested to run in sandbox only: http://(my_url)/maven/mavenprojectHelloWorld-1.0-SNAPSHOT.jar
at com.sun.deploy.security.DeployManifestChecker.verify(Unknown Source)
at com.sun.deploy.security.DeployManifestChecker.verify(Unknown Source)
at com.sun.javaws.security.AppPolicy.grantUnrestrictedAccess(Unknown Source)
at com.sun.javaws.security.JNLPSignedResourcesHelper.checkSignedResourcesHelper(Unknown Source)
at com.sun.javaws.security.JNLPSignedResourcesHelper.checkSignedResources(Unknown Source)
at sun.plugin2.applet.JNLP2Manager.prepareLaunchFile(Unknown Source)
at sun.plugin2.applet.JNLP2Manager.loadJarFiles(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

从我的 JAR 文件中检查清单文件后,我注意到缺少 permissionscodebase 标记。现在我想通过 Maven 添加这些。经过一番reading 和搜索,我在这里发现了一个类似的问题:Simpliest way to add an attribute to a jar Manifest in Maven。所以我尝试将以下内容添加到我的 pom.xml:

<project>
...
<build>
    ...
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.6</version>
        <configuration>
            <archive>
                <manifestEntries>
                    <Permissions>all-permissions</Permissions>
                    <Codebase>*</Codebase>
                </manifestEntries>
            </archive>
         </configuration>
     </plugin>
...
</build>
</project>

再次构建后,我检查了清单文件以查看我的更改,但清单文件似乎没有更改。我仍然收到以下信息:

Manifest-Version: 1.0
Permissions: sandbox
JavaFX-Version: 8.0
Created-By: JavaFX Packager
Main-Class: com.mycompany.mavenprojecthelloworld.MainApp

我一定是做错了什么或错过了什么。在阅读使用 Maven 创建 JNLP 文件以及如何编辑清单文件时,我注意到 Web 上的许多旧信息不再有效。所以这让我有点困惑该怎么做。我希望有人能指出我正确的方向。

2015 年 8 月 31 日更新:

忘了说我用的是velocity模板,你可以在下面找到模板:

<?xml version="1.0" encoding="utf-8"?>
<jnlp
    spec="1.0+"
    codebase="$jnlpCodebase"
    href="$outputFile">

    <information>
        <title>$project.name</title>
        <vendor>$project.Organization.Name</vendor>
        <description>$project.Description</description>
    </information>
    <resources>
        <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se" />
        $dependencies
    </resources>
    <security>
        <all-permissions/>
    </security>
    <applet-desc width="1024" height="768" main-class="com.javafx.main.NoJavaFXFallback" name="$project.name">
        <param name="requiredFXVersion" value="8.0+"/>
    </applet-desc>
    <jfx:javafx-desc width="1024" height="768" main-class="$mainClass"  name="$project.name" />
    <update check="background"/>
</jnlp>

我注意到的另一件事是,使用 JNLP 配置文件构建工作正常。但是使用 JNLP 配置文件(在 NetBeans 中)运行项目似乎失败了(使用默认配置文件运行)。我不知道这是否与这个问题有关(因为我还不熟悉 Maven)。但是,这是尝试运行项目时 NetBeans 中的输出:

....
--- exec-maven-plugin:1.2.1:exec (default-cli) @ mavenprojectHelloWorld ---
Error: Could not find or load main class com.mycompany.mavenprojecthelloworld.MainApp
------------------------------------------------------------------------
BUILD FAILURE
------------------------------------------------------------------------
Total time: 1.308s
Finished at: Thu Aug 27 12:00:03 CEST 2015
Final Memory: 8M/155M
------------------------------------------------------------------------
Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.2.1:exec (default-cli) on project mavenprojectHelloWorld: Command execution failed. Process exited with an error: 1 (Exit value: 1) -> [Help 1]

【问题讨论】:

    标签: java maven manifest java-web-start jnlp


    【解决方案1】:

    我再次浏览了 Webstart Maven 插件信息,看来我必须改用&lt;updateManifestEntries&gt;,所以我调整了我的代码如下:

    <configuration>
        <codebase>...</codebase>
        <jnlp>
            <mainClass>com.mycompany.mavenprojecthelloworld.MainApp</mainClass>
        </jnlp>
        <pack200>
            <enabled>false</enabled>
        </pack200>
        <sign>
            ...
        </sign>
        <verbose>true</verbose>
        <updateManifestEntries>
            <Application-Name>HelloWorld</Application-Name>
            <Trusted-Library>true</Trusted-Library>
            <Permissions>all-permissions</Permissions> 
            <Codebase>*</Codebase>
            <Trusted-Only>true</Trusted-Only> 
        </updateManifestEntries>
     </configuration>
    

    通过寻找&lt;updateManifestEntries&gt;,我还偶然发现了这个问题,这对我也有帮助:New <updateManifestEntries> entries of webstart-maven-plugin breaks the application

    【讨论】:

      猜你喜欢
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多