【问题标题】:Eclipse build > Sign Jar > Jnlp deployment processEclipse 构建 > Sign Jar > Jnlp 部署过程
【发布时间】:2012-11-30 20:18:25
【问题描述】:

目前我收到有关如何找不到我的包含之一的错误,特别是

java.lang.ClassNotFoundException: org.jivesoftware.smack.provider.ProviderManager

我已经确认该文件作为可执行 jar 运行,所以我真的不知道为什么会出现这样的错误,有人可以提供一些见解吗?

这是我目前正在做的事情,如果其中任何步骤有误,请纠正我。

  1. 我使用我的(确认工作的)程序,运行它以仔细检查。

  2. 我右键单击项目>导出>可运行的jar文件并选择选项>将所需的库打包到生成的jar文件中并将Ant Build脚本导出到文件myProg.xml

    当myprog.xml出来的时候是这样的:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <project default="create_run_jar" name="Create Runnable Jar for Project myProg with Jar-in-Jar Loader">
    <!--this file was created by Eclipse Runnable JAR Export Wizard-->
    <!--ANT 1.7 is required                                        -->
    <target name="create_run_jar">
        <jar destfile="C:/Users/Dbell/Documents/EclipseProjects/myProg/myProg.jar">
            <manifest>
                <attribute name="Main-Class" value="org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader"/>
                <attribute name="Rsrc-Main-Class" value="com.myCom.noc.xmpptroubleshooter.Main"/>
                <attribute name="Class-Path" value="."/>
                <attribute name="Rsrc-Class-Path" value="./ httpasyncclient-4.0-beta2.jar httpcore-4.2.1.jar httpcore-nio-4.2.1.jar httpclient-4.2.1.jar commons-logging-1.1.1.jar commons-codec-1.6.jar log4j-1.2.12.jar logkit-1.0.1.jar avalon-framework-4.1.3.jar servlet-api-2.3.jar commons-net-3.1.jar xpp3_min-1.1.4c.jar NocLib-1.1.jar smack32-3.2.0.jar httpclient-3.1.jar"/>
            </manifest>
            <zipfileset src="jar-in-jar-loader.zip"/>
            <fileset dir="C:/Users/Dbell/Documents/EclipseProjects/myProg/bin"/>
            <zipfileset dir="C:\Users\Dbell\.ivy2\cache\org.apache.httpcomponents\httpasyncclient\jars" includes="httpasyncclient-4.0-beta2.jar"/>
            <zipfileset dir="C:\Users\Dbell\.ivy2\cache\org.apache.httpcomponents\httpcore\jars" includes="httpcore-4.2.1.jar"/>
            <zipfileset dir="C:\Users\Dbell\.ivy2\cache\org.apache.httpcomponents\httpcore-nio\jars" includes="httpcore-nio-4.2.1.jar"/>
            <zipfileset dir="C:\Users\Dbell\.ivy2\cache\org.apache.httpcomponents\httpclient\jars" includes="httpclient-4.2.1.jar"/>
            <zipfileset dir="C:\Users\Dbell\.ivy2\cache\commons-logging\commons-logging\jars" includes="commons-logging-1.1.1.jar"/>
            <zipfileset dir="C:\Users\Dbell\.ivy2\cache\commons-codec\commons-codec\jars" includes="commons-codec-1.6.jar"/>
            <zipfileset dir="C:\Users\Dbell\.ivy2\cache\log4j\log4j\jars" includes="log4j-1.2.12.jar"/>
            <zipfileset dir="C:\Users\Dbell\.ivy2\cache\logkit\logkit\jars" includes="logkit-1.0.1.jar"/>
            <zipfileset dir="C:\Users\Dbell\.ivy2\cache\avalon-framework\avalon-framework\jars" includes="avalon-framework-4.1.3.jar"/>
            <zipfileset dir="C:\Users\Dbell\.ivy2\cache\javax.servlet\servlet-api\jars" includes="servlet-api-2.3.jar"/>
            <zipfileset dir="C:\Users\Dbell\.ivy2\cache\commons-net\commons-net\jars" includes="commons-net-3.1.jar"/>
            <zipfileset dir="C:\Users\Dbell\.ivy2\cache\xpp3\xpp3_min\jars" includes="xpp3_min-1.1.4c.jar"/>
            <zipfileset dir="C:\Users\Dbell\.ivy2\cache\com.MyCom\NocLib\jars" includes="NocLib-1.1.jar"/>
            <zipfileset dir="C:\Users\Dbell\.ivy2\cache\com.MyCom\smack32\jars" includes="smack32-3.2.0.jar"/>
            <zipfileset dir="C:\Users\Dbell\.ivy2\cache\com.apache\httpclient\jars" includes="httpclient-3.1.jar"/>
        </jar>
      <signjar jar="myProg.jar" alias="myAlias" keystore="path/to/myKs.ks" storepass="MyPass"/>
    </target>
    </project>
    
  3. 从那里我右键单击 > 运行方式 > ant 构建文件来签署我的 jar。

  4. 然后我将它移动到存在launch.jnlp 文件的网络服务器。看起来像这样:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <jnlp codebase="http://myServer:8080/myProg/" href="http://myServer:8080/myProg/launch.jnlp" spec="6.0+">
      <information>
          <title>myProg</title>
          <vendor>myName</vendor>
          <homepage href="http://myServer:8080/myProg/"/>
          <description>myProg</description>
          <description kind="short">myProg</description>
    
    
      </information>
      <security>
        <all-permissions/>
      </security>
      <resources>
          <j2se version="1.6+" />
          <jar href="myProg.jar" main="true"/>
      </resources>
      <application-desc main-class="com.myCom.noc.pathToMain.Main">
    
      </application-desc>
    </jnlp>
    

应用程序启动时的完整堆栈跟踪:

java.lang.ClassNotFoundException: org.jivesoftware.smack.provider.ProviderManager
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at com.sun.jnlp.JNLPClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at com.myCom.noc.xmpptroubleshooter.Main.main(Main.java:83)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javaws.Launcher.executeApplication(Unknown Source)
at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

这是我罐子的里面

【问题讨论】:

  • 感谢格式化帮助@jschoen
  • 没问题,将问题/问题放在最前面对我来说效果更好,以获得回应。我认为它告诉人们在阅读所提供的其余信息时要寻找什么问题。
  • 是的,很可能是个好主意,这个已经让我走了几天,我完全没有选择。
  • 是否有可能获得更多的堆栈转储,通常是在 java-web-start 应用程序中获取 classnotfound 时,这仅仅是因为它不在类路径上,或者它是由某种机制加载的,不是 100 % 与 java-web-start 兼容
  • 看起来其他人在将 .jar 打包到其他 jar 中时遇到问题:stackoverflow.com/questions/10021715/…

标签: java deployment jnlp java-web-start


【解决方案1】:

正如@AkselWillgert 所暗示的,标准的Java 类加载器不会从其他Jars 中的Jars 加载类。有必要执行以下操作之一:

  1. 在 JNLP 的 resources 部分中添加对每个 Jar 的引用。或者实际上,我们可以更进一步,将常用的 API 放入可以被许多应用程序使用的扩展中。例如,E.G. commons-logging.jnlpjive.jnlp
  2. 从所有 Jar 中提取类并将它们添加到一个 Jar 中。这通常违反 API 的用户协议,会破坏可能在服务提供者接口中表达的数字签名和有用的清单信息。
  3. 安装一个可以在 Jars 中读取 Jar 的类加载器。这需要一个受信任的应用。

出于多种原因,第一个是最好的选择。


.. 我将如何签署所有这些罐子?

咨询signjar task 的文档会建议类似(复制/粘贴):

<signjar
    alias="testonly" keystore="testkeystore"
    storepass="apacheant"
    lazy="true"
    >
  <path>
    <fileset dir="dist" includes="**/*.jar" />
  </path>
</signjar>

警告

一些罐子可能已经过数字签名。如果是这样,最好留下原始签名。如何做到这一点,更多的是关于构建工具的问题。

【讨论】:

  • 安德鲁,你能解释一下我该怎么做吗?
  • 好吧,假设我将其他内容导出到 lib 文件夹中,我将如何签署所有这些 jar?
  • 你的摇滚太厉害了,简直不可思议。我已经为此工作了 3 或 4 天......该死的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 2016-06-06
  • 2010-09-05
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
相关资源
最近更新 更多