好的,这是我第一次尝试Java web start,所以我有用Maven构建的jar作为依赖库,并把它放到Apache根文件夹中,包括文件夹lib里面的所有依赖jars,然后我创建了密钥库,HTML,和JNLP文件。
我启动了Apache服务,尝试访问localhost并且它运行顺利,直到我使用浏览器的java插件运行jnlp文件,NoClassDefFoundError
显示,我知道我的依赖项罐子不包括在内。所以我发现How to include jar dependencies in java webstart project接受的答案对我不起作用,而且我不知道我做错了什么?
这是我的JNLP档案:
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="http://localhost/transactionSimulator2" href="launch.jnlp">
<information>
<title> Transaction Simulator</title>
<vendor> Daksa </vendor>
<homepage href=""></homepage>
<description>Transaction Simulator </description>
<description kind="short">Transaction Simulator</description>
<offline-allowed/>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.6+"/>
<jar href="TransactionSimulator-1.0-SNAPSHOT.jar" main="true" download="eager"/>
<target name="signLibs">
<signjar destDir="lib" alias="yusufNugraha" keystore="testKeys"
storepass="yusufnugraha" force="true" >
<path>
<fileset dir="lib" includes="*.jar" />
</path>
</signjar>
<echo message="Library files were signed."/>
</target>
</resources>
<application-desc main-class="com.daksa.transactionsimulator.ui.MainFrame">
</application-desc>
</jnlp>
答案 0 :(得分:4)
包含jar库的正确方法是:
<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="http://localhost/transactionSimulator2" href="launch.jnlp">
<information>
<title> Transaction Simulator</title>
<vendor> Daksa </vendor>
<homepage href=""></homepage>
<description>Transaction Simulator </description>
<description kind="short">Transaction Simulator</description>
<offline-allowed/>
</information>
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.6+"/>
<jar href="TransactionSimulator-1.0-SNAPSHOT.jar" main="true" download="eager"/>
<jar href="lib/file1.jar"/>
<jar href="lib/file2.jar"/>
<jar href="lib/file3.jar"/>
<jar href="lib/file4.jar"/>
<jar href="lib/file5.jar"/>
</resources>
<application-desc main-class="com.daksa.transactionsimulator.ui.MainFrame">
</application-desc>
答案 1 :(得分:0)
您可以使用uberjar,其中所有lib都被提取到更大的jar文件中。在这种情况下,只有文件要处理。 Maven中的maven-dependency-plugin可以为您完成此操作。它自动获取所有依赖项,因此它非常有用。我将这个程序集文件与插件一起使用:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<id>jar-with-dependencies</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>runtime</scope>
</dependencySet>
</dependencySets>
</assembly>
您还必须签署jar才能执行应用程序(在浏览器中)。
注意:如果您使用的是像Bouncy Castle这样的加密提供程序,那么当您在uberjar中包含此jar时,加密提供程序的签名就会被破坏。在这种情况下,您必须在extension
元素中将其添加为resources
的附加jar。
在汇编文件中,您必须将其排除在dependencySet
元素内,例如:
<excludes>
<exclude>org.bouncycastle:bcprov-jdk15on</exclude>
</excludes>
扩展JNLP看起来像这样:
<jnlp spec="1.0" href="bouncyCastle.jnlp">
<information>
<title>Bouncy Castle</title>
<description>Bouncy Castle Crypto Provider</description>
</information>
<security>
<all-permissions/>
</security>
<resources>
<jar href="https://www.bouncycastle.org/download/bcprov-jdk15on-152.jar"/>
</resources>
<component-desc />
</jnlp>
在这种情况下,您必须使用与主jar相同的密钥来对抗jar。否则延期被拒绝。出于某种原因,您必须使用相同的摘要算法才能获得验证错误。