【问题标题】:Deploying a java application via JWS and a generated JNLP通过 JWS 和生成的 JNLP 部署 Java 应用程序
【发布时间】:2012-11-27 20:59:31
【问题描述】:

我是自学 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 变量)

用户单击一个按钮 -> 转发到生成 JNLP 并触发 JWS 的 servlet -> 下载应用程序 -> 用户呈现我可爱的客户端 GUI。

因为这没有发生。

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

WEB-INF 有 lib/、classes(只有上面描述的构建的 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 库放在哪里,仍然无法通过 NoCLassDefFoundException (NCDFE)。 log4j-1.2.17.jar 应该去哪里?我原本以为在 WAR 文件的 WEB-INF/lib 文件夹中,以及 Class-Path: 行。 lib/log4j-1.2.17.jar 在 META-INF/MANIFEST.MF 文件中。但这仍然显示了 NCDFE,所以我将它风车到其他文件夹中,更改了清单,甚至尝试将 ext lib 放入 JAR 而不是 WAR,但无济于事。它应该去哪里..只是让我很清楚。 (JAR 和 WAR 文件以及 WEB-INF 文件夹的清单中应该包含什么?)我在 t'internets 上查看了这么多 NCDFE 帖子,我认为这一切都很快变得令人困惑。

【问题讨论】:

  • 如果你用winzip打开mygame.jar,里面有东西吗?
  • 是的。它包含应用程序的所有类文件和图像、带有外部 log4j 的 lib 文件,以及包含一些 jarsigning 文件和 MANIFEST.MF 文件的 META-INF 文件夹... Manifest-Version: 1.0 Ant-Version: Apache Ant 1.8.2 类路径:. lib/log4j-1.2.17.jar Created-By: Me Main-Class: package.MyGame
  • 但从概念上讲,我认为您对 jws 的理解是对的,所以请继续调试 :)
  • 为抬头干杯。我迟早会上
  • jnlpCodebase的值是多少?

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


【解决方案1】:

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

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

【讨论】:

  • 是的,我愿意。我在想(或在某处读过)这可能是我的 servlet 上的重定向导致问题。与代码库有关。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多