2

現在、具体的には、インクルードの 1 つが見つからないというエラーが発生しています。

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

ファイルが実行可能なjarとして実行されていることを確認したので、なぜこのようにエラーが発生するのか本当にわかりません.誰かが私に洞察を提供できますか?

これが私が現在行っていることです。これのステップが間違っている場合は修正してください。

  1. 私は(動作確認済みの)プログラムを取得し、実行して再確認します。

  2. プロジェクトを右クリック > [エクスポート] > [実行可能な jar ファイル] を選択し、オプションを選択 > 必要なライブラリを生成された jar ファイルにパッケージ化し、Ant ビルド スクリプトをファイル 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 ファイルが存在する Web サーバーに移動します。それは次のようになります。

    <?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)

そして、これが私の瓶の中身です うちの瓶の中身はこんな感じ

4

1 に答える 1

2

@AkselWillgert で示唆されているように、標準の Java クラスローダーは、他の Jar 内の Jar からクラスをロードしません。次のいずれかを行う必要があります。

  1. resourcesJNLPのセクションに各 Jar への参照を追加します。または実際には、さらに進んで、一般的に使用される API を、多くのアプリで使用できる拡張機能に入れることもできます。例: acommons-logging.jnlpまたはjive.jnlp.
  2. すべての Jar からクラスを抽出し、それらを 1 つの Jar に追加します。これは通常、API のユーザー同意に反するものであり、サービス プロバイダー インターフェイスで表現される可能性のあるデジタル署名と有用なマニフェスト情報を破棄します。
  3. Jar 内の Jar を読み取ることができるクラスローダーをインストールします。それには、信頼できるアプリが必要です。

さまざまな理由から、最初のオプションが最適です。


.. これらすべての jar に署名するにはどうすればよいですか?

signjarタスクのドキュメントを参照すると、 (コピー/貼り付け) のようなものが提案されます。

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

警告

一部の Jar は、すでにデジタル署名されている場合があります。その場合は、元の署名を残すことをお勧めします。それを行う方法は、ビルドツールに関する質問です。

于 2012-12-02T01:28:02.630 に答える