如何使用JNLP文件包含依赖jar?

时间:2015-03-12 03:28:52

标签: java maven jar java-web-start

好的,这是我第一次尝试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>

2 个答案:

答案 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。否则延期被拒绝。出于某种原因,您必须使用相同的摘要算法才能获得验证错误。