当前位置: 首页 > 知识库问答 >
问题:

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

司空坚
2023-03-14

好的,这是我第一次尝试Java web start,所以我有了用Maven构建的jar作为依赖项存储库,并将其放入Apache根文件夹,包括文件夹库中的所有依赖项jar,然后我创建了密钥存储、HTML和JNLP文件。

我启动了Apache服务,并尝试访问localhost,它运行得很顺利,直到我用浏览器的java插件运行了jnlp文件,NoClassDefFoundError显示,我知道我的依赖项JAR不包括在内。所以我发现了如何在JavaWebStart项目中包含jar依赖项——公认的答案对我来说不适用,我不知道我做错了什么?

这是我的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个答案

祁刚毅
2023-03-14

您可以使用uberjar,其中所有库都被提取到一个更大的jar文件中。在这种情况下,只有文件要处理。Maven中的maven-依赖-插件可以为您做到这一点。它会自动获取所有依赖项,所以这很重要。我正在将这个汇编文件与插件一起使用:

    <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这样的加密提供程序,当您将此jar包含在uberjar中时,加密提供程序的签名会被破坏。在这种情况下,您必须将其作为附加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进行反签名。否则,延期将被拒绝。出于某种原因,您必须使用相同的摘要算法来避免验证错误。

吴涵育
2023-03-14

包含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>
 类似资料:
  • 问题内容: 我在Eclipse中有一个对我的工作区中的另一个Java项目有依赖性的对象。在内置的Tomcat服务器中运行Web项目时,我已将项目依赖项添加到 运行配置中 的类路径中。我想创建一个WAR,用于在外部服务器上部署Web项目。依赖性Java项目已添加到Eclipse中的 Java Build路径 ,但是当我导出WAR文件时,该库不包括在内。还可以在 Order and Export中 选

  • 我有一个maven项目,它被配置为(通过使用pom.xml和assembly.xml)在运行时打包一个zip文件,该文件包含编译后的webapp(war文件)和src/main/文件夹下的所有文件。 这个项目导入/使用另一个maven项目(它变成了一个jar文件),而该项目反过来也导入/使用第三个maven项目(同样是一个jar文件)。 第三个项目还包含src/main/文件夹中的一些文件,我希望

  • 我写了一些库,其中有一部分UI。此外,这个库使用另一个库。我想提供发行版来在任何应用程序中使用这部分UI。 我得库有下一个依赖项: /home/user/projects/mainapp/app/build/intermediates/explodede-aar/com.my.sdk/sdk/0.0.1/res/values/values.xml:78:21-29:找不到与给定名称匹配的资源:at

  • 我们正在尝试使用java webstart开发一个打印应用程序。我们使用eclipse将jar创建为普通jar文件。我们的应用程序需要外部库来连接数据库、将数据转换为字节等。 我们以前可以通过将必要的JAR放入jre文件夹的/ext/目录来实现这一点。然而,这导致了与tomcat服务器的库冲突,所以我们希望避免这种方法。 我们还尝试将项目导出为可运行的jar,因为所需的库也已打包在jar中。但是当

  • 我正在开发一个Java项目,使用maven作为依赖项管理器/构建工具。我当前在将依赖项的依赖项解析到正确版本时遇到问题。 有问题的依赖项称为JasperReports-Functions-6.1.0.jar,它不是托管在maven repo中,而是以jar形式提供的。 如何强制jar依赖项使用子依赖项的某个版本?

  • 问题内容: 摘要: 我有一个依赖于JAR文件的AAR文件,当我构建AAR项目时,它不包含JAR代码。 细节: 我有一个Java SDK库项目,其中包含我们用于Java Web项目的代码,此类库是使用内部Nexus服务器(如JAR)创建的,并驻留在内部。 目的是通过一个AAR库提供此JAR库的“ Android配置”版本,多个Android应用程序可以使用该版本,并最大程度地减少了实现它的工作量(和