JWS 是否在 JAR 中为小程序加载 JAR?
Does JWS load JARs inside JAR for applets?
我正在维护通过 Java Web Start
启动的 Java 小程序,但我对这项技术知之甚少(我们正在远离小程序,但我们需要对其进行一些维护)。本小程序依赖于一些外部JAR文件(batik等)。
我们使用 gradle
作为构建系统。我们构建一个普通 JAR 和一个胖 JAR(使用 com.github.johnrengelman.shadow
插件)如下:
sourceSets {
main {
java {
}
}
}
repositories {
flatDir {
dirs 'lib'
}
}
dependencies {
compile 'commons-lang:commons-lang:2.0',
'jargs:jargs:1.0',
'org.apache.xmlgraphics:batik-svggen:1.7',
'org.apache.xmlgraphics:batik-dom:1.7',
'org.apache.xmlgraphics:batik-awt-util:1.7',
'org.apache.xmlgraphics:batik-util:1.7',
'org.apache.xmlgraphics:batik-xml:1.7',
'xerces:xercesImpl:2.8.0'
}
jar {
manifest {
attributes 'Application-Name': project.name,
'Permissions': 'all-permissions',
'Implementation-Title': project.name,
'Implementation-Version': version,
'Main-Class': 'Foo',
'Class-Path': configurations.compile.files.collect{ "lib/${it.name}" }.join(' ')
}
baseName project.name
// include dependencies into lib dir in produced jar
into('lib') {
from configurations.runtime
}
from "README.md"
}
shadowJar {
baseName project.name
}
gradle
包含主 JAR 内 lib/
文件夹中的 JAR 文件,并将它们添加到 MANIFEST.MF
中的 Class-Path
。
该小程序可以在客户端计算机上使用普通 JAR,但我不完全理解为什么。
不知何故,当 Java Web Start
启动小程序时加载 JAR 文件。 JNLP 文件中没有提到它们(没有 <resource>
)并且没有 class 加载器(我们不使用 JarRsrcLoader
或类似的)所以我猜这是因为它们在 Class-Path
但我不确定,而且我无法制作 MWE。事实上,我发现的所有信息都是相反的(至少对于与小程序相反的应用程序)。
有人知道是这种情况还是简单的 explanation/tutorial 吗?
嗯,我错了。事实上,JAR 文件没有被加载:当一个人试图访问需要 batik 的功能时,它失败了。这证实了我的阅读以及@eckes 和@zakki 的评论。
我还发现我可以简化我们的 build.gradle
文件。
我正在维护通过 Java Web Start
启动的 Java 小程序,但我对这项技术知之甚少(我们正在远离小程序,但我们需要对其进行一些维护)。本小程序依赖于一些外部JAR文件(batik等)。
我们使用 gradle
作为构建系统。我们构建一个普通 JAR 和一个胖 JAR(使用 com.github.johnrengelman.shadow
插件)如下:
sourceSets {
main {
java {
}
}
}
repositories {
flatDir {
dirs 'lib'
}
}
dependencies {
compile 'commons-lang:commons-lang:2.0',
'jargs:jargs:1.0',
'org.apache.xmlgraphics:batik-svggen:1.7',
'org.apache.xmlgraphics:batik-dom:1.7',
'org.apache.xmlgraphics:batik-awt-util:1.7',
'org.apache.xmlgraphics:batik-util:1.7',
'org.apache.xmlgraphics:batik-xml:1.7',
'xerces:xercesImpl:2.8.0'
}
jar {
manifest {
attributes 'Application-Name': project.name,
'Permissions': 'all-permissions',
'Implementation-Title': project.name,
'Implementation-Version': version,
'Main-Class': 'Foo',
'Class-Path': configurations.compile.files.collect{ "lib/${it.name}" }.join(' ')
}
baseName project.name
// include dependencies into lib dir in produced jar
into('lib') {
from configurations.runtime
}
from "README.md"
}
shadowJar {
baseName project.name
}
gradle
包含主 JAR 内 lib/
文件夹中的 JAR 文件,并将它们添加到 MANIFEST.MF
中的 Class-Path
。
该小程序可以在客户端计算机上使用普通 JAR,但我不完全理解为什么。
不知何故,当 Java Web Start
启动小程序时加载 JAR 文件。 JNLP 文件中没有提到它们(没有 <resource>
)并且没有 class 加载器(我们不使用 JarRsrcLoader
或类似的)所以我猜这是因为它们在 Class-Path
但我不确定,而且我无法制作 MWE。事实上,我发现的所有信息都是相反的(至少对于与小程序相反的应用程序)。
有人知道是这种情况还是简单的 explanation/tutorial 吗?
嗯,我错了。事实上,JAR 文件没有被加载:当一个人试图访问需要 batik 的功能时,它失败了。这证实了我的阅读以及@eckes 和@zakki 的评论。
我还发现我可以简化我们的 build.gradle
文件。