Java 如何在没有代码库的情况下使用JNLP?

Java 如何在没有代码库的情况下使用JNLP?,java,java-web-start,jnlp,Java,Java Web Start,Jnlp,我们有一个应用程序,将部署在具有不同IP的服务器上。JNLP在构建时生成。 因此,我们定义了没有代码库的JNLP: <jnlp spec="1.0+" href="app.jnlp"> 但是,当第二次启动这个应用程序时(从第一次启动时创建的桌面图标),代码库被设置为本地文件系统,这是绝对无用的。 我希望JavaWebStart在第一次启动应用程序时使用实际的源地址设置代码库。这似乎不是真的 如何准备一个在不同服务器上无需修改即可使用的通用JNLP?JDK的sample/JNLP

我们有一个应用程序,将部署在具有不同IP的服务器上。JNLP在构建时生成。 因此,我们定义了没有代码库的JNLP:

<jnlp spec="1.0+" href="app.jnlp">

但是,当第二次启动这个应用程序时(从第一次启动时创建的桌面图标),代码库被设置为本地文件系统,这是绝对无用的。 我希望JavaWebStart在第一次启动应用程序时使用实际的源地址设置代码库。这似乎不是真的

如何准备一个在不同服务器上无需修改即可使用的通用JNLP?

JDK的sample/JNLP/servlet目录中提供的可用于在运行时从模板生成JNLP,插入正确的代码库,例如:

<jnlp spec="1.0+" codebase="$$codebase" href="app.jnlp">

Mojohaus提供了servlet的mavenized包

您还需要在签名的主jar中提供一个JNLP-INF/APPLICATION_TEMPLATE.JNLP文件。这与您的app.jnlp相同,但在$$codebase中有一个星号:

<jnlp spec="1.0+" href="app.jnlp">
<jnlp spec="1.0+" codebase="*" href="app.jnlp">

JDK的sample/jnlp/servlet目录中提供的可用于在运行时从模板生成jnlp,插入正确的代码库,例如:

<jnlp spec="1.0+" codebase="$$codebase" href="app.jnlp">

Mojohaus提供了servlet的mavenized包

您还需要在签名的主jar中提供一个JNLP-INF/APPLICATION_TEMPLATE.JNLP文件。这与您的app.jnlp相同,但在$$codebase中有一个星号:

<jnlp spec="1.0+" href="app.jnlp">
<jnlp spec="1.0+" codebase="*" href="app.jnlp">


如果要生成它,为什么不为每个服务器生成一个单独的.jnlp文件?@VGR它是在构建时生成的。在构建时,我们不知道目标服务器的IP地址。它们甚至可能随着时间的推移而改变。服务器运行的是什么软件?如果它是一个servlet容器(Tomcat、GlassFish等),您可以动态地提供.jnlp内容。@VGR注意,此时正确签名意味着也要在Jar中编写代码库。因此,为了正确的签名,在jar中编写代码库,对jar(用于该代码库)进行签名,然后编写启动文件以包含代码库。我不确定动态实现这些目标有多实际(从未尝试过)。@AndrewThompson你是对的。我认为这是可能的,但非常复杂,因为servlet需要访问密钥库、密钥库的密码、一个
jarsigner
二进制文件(除非它可以通过编程实现;我不知道是否可以)和原始的.jar文件。规范说签名的JNLP文件是可选的,所以如果是可选的,我倾向于避免签名。如果要生成它,为什么不为每个服务器生成一个单独的.JNLP文件?@VGR它是在构建时生成的。在构建时,我们不知道目标服务器的IP地址。它们甚至可能随着时间的推移而改变。服务器运行的是什么软件?如果它是一个servlet容器(Tomcat、GlassFish等),您可以动态地提供.jnlp内容。@VGR注意,此时正确签名意味着也要在Jar中编写代码库。因此,为了正确的签名,在jar中编写代码库,对jar(用于该代码库)进行签名,然后编写启动文件以包含代码库。我不确定动态实现这些目标有多实际(从未尝试过)。@AndrewThompson你是对的。我认为这是可能的,但非常复杂,因为servlet需要访问密钥库、密钥库的密码、一个
jarsigner
二进制文件(除非它可以通过编程实现;我不知道是否可以)和原始的.jar文件。规范说签名的JNLP文件是可选的,所以如果可以的话,我倾向于避免签名。