通过JWS和生成的JNLP部署Java应用程序

时间:2012-11-27 20:59:31

标签: java tomcat servlets jnlp java-web-start

我是一个相当自学成才的java,但我认为我有一个好主意,直​​到我无法让它工作。

部署我的服务器/客户端程序的最佳方法是什么?

让我们说服务器已经启动并忠实地等待连接。

我需要能够让客户端运行我的应用程序,但需要使用特定于用户的参数。

什么阻止我在我的网站上的servlet中“动态”生成JNLP(所以我可以得到自定义参数):

String jnlpCodebase = "http://" + request.getLocalAddr() + ":" + request.getLocalPort() + request.getContextPath();
out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
out.println("<jnlp spec=\"1.0+\" codebase=\"" + jnlpCodebase + "\">");
out.println("<information>");
out.println("   <title>etc</title>");
out.println("   <vendor>etc</vendor>");
out.println("</information>");
out.println("<security>");
out.println("   <all-permissions/>");
out.println("</security>");
out.println("<resources>");
out.println("   <j2se version=\"1.6+\"/>");
out.println("   <jar href=\"web/MyGame.jar\" main=\"true\"/>");
out.println("</resources>");
out.println("<application-desc main-class=\"runtime.SSCCEServer\">");
out.println("   <argument>" + name + "</argument>");
out.println("</application-desc>");
out.println("</jnlp>");

(其中name是来自servlet的java变量)

用户点击按钮 - &gt;转发到生成JNLP并触发JWS的servlet - &gt;申请已下载 - &gt;用户提供了我可爱的客户端GUI。

因为没有发生这种情况。

我已将项目(包含此servlet和WEB-INF下的jar依赖项)部署为WAR文件,然后将其部署到Tomcat服务器。

WEB-INF有lib /,类(只有上面描述的构建的servlet .class文件)和web.xml(描述servlet,它的名称和描述JDBC连接的映射)。

有人能想到这个设计失败的原因吗?我尝试过没有代码库,但这会产生一些非直观的错误,至少在目前,我的JNLP文件看起来很好(通过http://pscode.org/janela/验证),但运行时给出了:

#### Java Web Start Error:
#### Unable to load resource: .../MyGame.jar

包含例外

java.util.zip.ZipException: ZIP file must have at least one entry
at java.util.zip.ZipOutputStream.finish(Unknown Source)
at java.util.zip.DeflaterOutputStream.close(Unknown Source)
at java.util.zip.ZipOutputStream.close(Unknown Source)
at com.sun.deploy.net.HttpDownloadHelper.download(Unknown Source)
at com.sun.deploy.cache.Cache.downloadResourceToTempFile(Unknown Source)
at com.sun.deploy.cache.Cache.downloadResourceToCache(Unknown Source)
at com.sun.deploy.net.DownloadEngine.actionDownload(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getCacheEntry(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getCacheEntry(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getResourceCacheEntry(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getResourceCacheEntry(Unknown Source)
at com.sun.deploy.net.DownloadEngine.getResource(Unknown Source)
at com.sun.javaws.LaunchDownload$DownloadTask.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Google对特定的例外情况没有多少帮助,但是如果没有正当理由可以解决这个问题,我会继续尝试。

编辑1:更改了jar文件的布局并删除了一些库(特别是同样位于war文件中的mysql?),因为不需要将这些库与jar捆绑在一起。 这已经停止了上述错误。我认为那里可能存在问题?我还在JNLP中为j2se标签添加了一个href ...

<resources>
<j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/>
<jar href="web/MyGame.jar" main="true"/>
</resources>

现在似乎在本地运行。

编辑2:无论在哪里放置必要的ext lib,仍然无法通过NoCLassDefFoundException(NCDFE)。 log4j-1.2.17.jar应该去哪里?我最初想到的是WAR文件的WEB-INF / lib文件夹,以及 Class-Path:行。 META-INF / MANIFEST.MF文件中的lib / log4j-1.2.17.jar 。但是仍然显示NCDFE,所以我已经将它风化到其他文件夹中,更改了清单,甚至尝试将ext lib放入JAR而不是WAR,但无济于事。它应该去哪里......就这样我很清楚。 (在JAR和WAR文件以及WEB-INF文件夹的清单中应该包含哪些内容?)我在t'internets上查看了很多NCDFE帖子,我认为这些内容很快就会变得混乱。

2 个答案:

答案 0 :(得分:1)

资源web/MyGame.jar应位于war文件的web子目录中。你在战争中有以下布局吗?

app.war
  META-INF/
    MANIFEST.MF
  WEB-INF/
    web.xml
    classes/
      *.class
    lib/
      *.lib
  web/
    MyGame.jar

答案 1 :(得分:0)

不幸的是,其中一个“玩弄并修复它”。 我将MyGame.jar放在与.jsps(WAR的根目录)相同的位置,MANIFEST指的是lib文件夹中的扩展jar(Class-Path :)。 我相信我以前也有。