0

XMLファイルでクラス「org.eclipse.jetty.server.Server」を使用して、さまざまなパラメーターで初期化しています(これはOSGi環境であることに注意してください)。ただし、クラス「org.eclipse.jetty.server.Server」を使用しているバンドルが起動せず、次の例外がスローされます。

java.lang.ClassNotFoundException: org.eclipse.jetty.server.Server
        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 java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at org.eclipse.core.runtime.internal.adaptor.ContextFinder.loadClass(ContextFinder.java:129)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at org.eclipse.jetty.util.Loader.loadClass(Loader.java:92)
        at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.nodeClass(XmlConfiguration.java:349)
        at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:327)

jetty サーバー バンドルが稼働中であることを確認し、マニフェスト ファイルの "Imported-Packages" セクションで適切なバージョンを指定したことも確認しました。助けてください。

4

1 に答える 1

0

そのような方法で Jetty を使用したい場合

  • Jetty は XML 構成に基づいて初期化されます
  • OSGi 環境内で使用されます

jetty-osgi-bootバンドルを使用することをお勧めします。その使用方法の詳細については、 Jetty のドキュメントを参照してください。

jetty-xml に基づいてカスタム ソリューションを開発する場合は、jetty-boot がどのようにそれを行うかを確認する必要があります。

いくつかのヒント:

  • 構成は、 ServerInstanceWrapper.configure()関数の最後で XML ファイルから読み取られます。
  • それはDefaultJettyAtJettyHomeHelper.startJettyAtJettyHome(...)から呼び出されます
  • そこには、サーバーが XML から構成されるまで、スレッド コンテキスト クラスローダーがオーバーライドされるというトリックがあります。

    ClassLoader contextCl = Thread.currentThread().getContextClassLoader();
    try
    {
        Thread.currentThread().setContextClassLoader(JettyBootstrapActivator.class.getClassLoader());
    
        ...
    
        Server server = ServerInstanceWrapper.configure(null, configURLs, properties);
    
        ...
    
        return server;
    }
    ...
    finally
    {
        Thread.currentThread().setContextClassLoader(contextCl);
    }
    

リンクと例は Jetty 9.2.9 のものであることに注意してください。これはコードが少し優れているためですが、Jetty バージョンの jetty-osgi-boot で同じまたは類似のロジックを見つけることができます。

スレッド コンテキスト ClassLoader をいじるのは良いことではありませんが、TCL を使用するコードが呼び出されるときに必要になることがあります。Jetty の XMLConfiguration クラスが ClassLoader をパラメーターとして受け入れた場合に最適です。

于 2015-02-26T20:48:38.440 に答える