Java 如何使用JNLP文件包含依赖项jar?
好的,这是我第一次尝试JavaWebStart,所以我有了用Maven构建的jar作为依赖项存储库,并将其放入Apache根文件夹,包括文件夹库中的所有依赖项jar,然后我创建了密钥存储、HTML和JNLP文件 我启动了Apache服务,并尝试访问localhost,它一直运行顺利,直到我使用浏览器的java插件运行jnlp文件,Java 如何使用JNLP文件包含依赖项jar?,java,maven,jar,java-web-start,Java,Maven,Jar,Java Web Start,好的,这是我第一次尝试JavaWebStart,所以我有了用Maven构建的jar作为依赖项存储库,并将其放入Apache根文件夹,包括文件夹库中的所有依赖项jar,然后我创建了密钥存储、HTML和JNLP文件 我启动了Apache服务,并尝试访问localhost,它一直运行顺利,直到我使用浏览器的java插件运行jnlp文件,NoClassDefFoundError显示,我知道我的依赖项JAR不包括在内。所以我发现被接受的答案对我不起作用,我不知道我做错了什么 这是我的JNLP文件: 事务
NoClassDefFoundError
显示,我知道我的依赖项JAR不包括在内。所以我发现被接受的答案对我不起作用,我不知道我做错了什么
这是我的JNLP文件:
事务模拟器
达克萨
事务模拟器
事务模拟器
包含jar库的正确方法是:
事务模拟器
达克萨
事务模拟器
事务模拟器
包含jar库的正确方法是:
事务模拟器
达克萨
事务模拟器
事务模拟器
您可以使用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>
扩展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>
弹跳城堡
Bouncy Castle加密提供程序
在这种情况下,您必须使用与主jar相同的密钥对jar进行反签名。否则,将拒绝扩展。出于某种原因,您必须使用相同的摘要算法以避免验证错误。您可以使用uberjar,其中所有LIB都被提取到一个更大的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>
扩展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>
弹跳城堡
Bouncy Castle加密提供程序
在这种情况下,您必须使用与主jar相同的密钥对jar进行反签名。否则,将拒绝扩展。出于某种原因,您必须使用相同的摘要算法以避免验证错误。在
jnlp
文件中target
元素在做什么?检查结构target
元素在jnlp
文件中做什么?检查结构在我有这么多依赖项之前它是可以接受的,我的意思是它没有效率,我必须在jnlp中多次添加
,还有其他选择吗?如果您担心为JAR编写所有这些行的“效率低下”,请为每个实际需要下载这些JAR的客户端考虑一下!在JavaWebStart jnlp中,如果不为每个jar文件指定确切的文件名和路径,则无法导入jar文件。例如,不能使用lib/*.jar。你有多少jar文件?您可以编写一个脚本,通过遍历文件夹中的所有文件并将它们逐个添加到jnlp来生成jnlp文件。正如Andrea所说,请注意,如果您有太多的jar文件,那么客户端下载它们的速度可能会太慢。这不起作用,它会给出错误消息,因为jar资源没有使用相同的证书签名。这是显而易见的,因为第三方jar将由各自的人签名。您必须使用您的证书对jar文件进行签名,这样才能工作。在我有这么多依赖项之前,这是可以接受的,我的意思是这不是有效的,我必须在jnlp中多次添加
,还有其他选择吗?如果您担心为JAR编写所有这些行的“效率低下”,请为每个实际需要下载这些JAR的客户机考虑一下!在JavaWebStart jnlp中,如果不为每个jar文件指定确切的文件名和路径,则无法导入jar文件。例如,不能使用lib/*.jar。你有多少jar文件?您可以编写一个脚本,通过遍历文件夹中的所有文件并将它们逐个添加到jnlp来生成jnlp文件。正如Andrea所说,请注意,如果您有太多的jar文件,那么客户端下载它们的速度可能会太慢。这不起作用,它会给出错误消息,因为jar资源没有使用相同的证书签名。这是显而易见的,因为第三方jar将由各自的人签名。您必须使用证书对jar文件进行签名,这样才能工作。