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 文件。