如何结合 Webstart Maven 插件使用 Maven 添加 'all-permissions' 到清单文件?
How to add 'all-permissions' to manifest file with Maven in combination with Webstart Maven plugin?
我最近开始尝试使用 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>
当我构建它时,它会生成一个 launch.jnlp 文件和一个 mavenprojectHelloWorld-1.0-SNAPSHOT.jar /target/jnlp
目录中的文件。我仔细检查了 jarsigner 以检查我的 jar 文件是否已正确签名。这是输出:
我将 launch.jnlp 和 mavenprojectHelloWorld-1.0-SNAPSHOT.jar 文件复制到我的虚拟主机(http://(my_url)/maven) 并通过启动 JNLP 文件启动 HelloWorld 应用程序。但是,当我这样做时,我收到一条消息 'Java Application Blocked' window 和 'Application Error' 之后:
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 文件中的清单文件后,我注意到缺少 permissions 和 codebase 标签。现在我想通过 Maven 添加这些。经过一番reading and searching, I found a similar question here: 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 文件以及如何编辑清单文件的内容时,我注意到网络上有很多不再有效的旧信息。所以这有点让我不知道该怎么做。我希望有人能指出我正确的方向。
2015 年 8 月 31 日更新:
忘了说我用的是速度模板,你可以在下面找到模板:
<?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]
我又看了一遍Webstart Maven Plugin的资料,看来必须要用<updateManifestEntries>
,所以我调整了我的代码如下:
<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>
通过寻找 <updateManifestEntries>
我也偶然发现了这个问题,这对我也有进一步的帮助:New <updateManifestEntries> entries of webstart-maven-plugin breaks the application
我最近开始尝试使用 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>
当我构建它时,它会生成一个 launch.jnlp 文件和一个 mavenprojectHelloWorld-1.0-SNAPSHOT.jar /target/jnlp
目录中的文件。我仔细检查了 jarsigner 以检查我的 jar 文件是否已正确签名。这是输出:
我将 launch.jnlp 和 mavenprojectHelloWorld-1.0-SNAPSHOT.jar 文件复制到我的虚拟主机(http://(my_url)/maven) 并通过启动 JNLP 文件启动 HelloWorld 应用程序。但是,当我这样做时,我收到一条消息 'Java Application Blocked' window 和 'Application Error' 之后:
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 文件中的清单文件后,我注意到缺少 permissions 和 codebase 标签。现在我想通过 Maven 添加这些。经过一番reading and searching, I found a similar question here: 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 文件以及如何编辑清单文件的内容时,我注意到网络上有很多不再有效的旧信息。所以这有点让我不知道该怎么做。我希望有人能指出我正确的方向。
2015 年 8 月 31 日更新:
忘了说我用的是速度模板,你可以在下面找到模板:
<?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]
我又看了一遍Webstart Maven Plugin的资料,看来必须要用<updateManifestEntries>
,所以我调整了我的代码如下:
<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>
通过寻找 <updateManifestEntries>
我也偶然发现了这个问题,这对我也有进一步的帮助:New <updateManifestEntries> entries of webstart-maven-plugin breaks the application