2012-10-22 51 views
1

它又是我。而今天,我面臨着一個奇怪的問題。要麼我沒有正確理解某些東西,要麼我只是錯過了樹木前的阿甘。JNLP:tools.jar不在類路徑中

以下情形:

  • 我使用JavaFX,在JDK 1.7
  • 我需要兩個客戶端運行時綁定:桌面(JAR)和小程序(在瀏覽器中JNLP)
  • 我有一個Maven項目設立項目
  • 我有一個父POM和不同的子模塊
  • 我需要我的客戶端與web服務進行交流,對於我心中已經選擇CXF爲框架(我需要ŧ Ø能夠連接到Web服務
  • 「連接到Web服務的東西」是叫wsConnector

這裏的自己行家子模塊一些更多的環境信息,並開啓運行Web服務)我POM片段:

mvn -version 
Apache Maven 3.0.4 (r1232337; 2012-01-17 09:44:56+0100) 
Maven home: C:\Program Files (x86)\Apache\maven-3.0.4\bin\.. 
Java version: 1.7.0_07, vendor: Oracle Corporation 
Java home: C:\Program Files\Java\jdk1.7.0_07\jre 
Default locale: de_DE, platform encoding: Cp1252 
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows" 

爲了能夠編譯wsConnector子模塊,再一次大約需要所有的Web服務連接東西照顧,我需要到的tools.jar從JDK結合起來,作爲CXF需要這一點。從父pom.xml的

相關屬性:

<properties> 
    <maven.compiler.source>1.7</maven.compiler.source> 
    ... 
</properties> 

子模塊的pom.xml:

<properties> 
    <cxf.version>2.6.2</cxf.version> 
</properties> 

<dependencies> 
    <dependency> 
     ... // some other sub modules 
    </dependency> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-frontend-jaxws</artifactId> 
     <version>${cxf.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-transports-http</artifactId> 
     <version>${cxf.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-rt-transports-http-jetty</artifactId> 
     <version>${cxf.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.oracle</groupId> 
     <artifactId>tools</artifactId> 
     <version>${maven.compiler.source}]</version> 
     <scope>system</scope> 
     <systemPath>${java.home}/../lib/tools.jar</systemPath> 
    </dependency> 
</dependencies> 

如果我運行mvn clean package,一切工作正常,很正常。在我的客戶端應用程序的部署目錄中(jar,生成的HTML和jnlp文件也在這裏),我也找到了tools.jar

如果我在JNLP文件一看,我發現條目:

<jar href="tools.jar" size="15226565" download="eager" /> 

現在我的問題是:如果我運行客戶端java -jar client.jar,一切正常。但是如果我調用HTML/JNLP文件,我得到一個ClassNotFoundException,指出tools.jar不在類路徑中。 因此,它不關心我是否從服務器或本地主機打開小程序。

這裏是堆棧跟蹤:

java.lang.IllegalStateException: Unable to create schema compiler 
at org.apache.cxf.common.jaxb.JAXBUtils.createSchemaCompilerWithDefaultAllocator(JAXBUtils.java:694) 
at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.createClient(DynamicClientFactory.java:303) 
at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.createClient(DynamicClientFactory.java:270) 
at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.createClient(DynamicClientFactory.java:263) 
at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.createClient(DynamicClientFactory.java:198) 
at com.multiguide.ws.WebServiceConnector.setWsdlUrl(WebServiceConnector.java:45) 
at com.multiguide.ws.WebServiceConnector.setWsdlUrl(WebServiceConnector.java:31) 
at com.multiguide.view.administration.WebServiceInformationPanel.connect(WebServiceInformationPanel.java:130) 
at com.multiguide.view.administration.WebServiceInformationPanel.refresh(WebServiceInformationPanel.java:70) 
at com.multiguide.view.administration.WebServiceInformationPanel.<init>(WebServiceInformationPanel.java:45) 
at com.multiguide.view.administration.WebServiceInformationPanel$$FastClassByGuice$$da5f387e.newInstance(<generated>) 
at com.google.inject.internal.cglib.reflect.$FastConstructor.newInstance(FastConstructor.java:40) 
at com.google.inject.internal.DefaultConstructionProxyFactory$1.newInstance(DefaultConstructionProxyFactory.java:60) 
at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:85) 
at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254) 
at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38) 
at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62) 
at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:84) 
at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254) 
at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46) 
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031) 
at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) 
at com.google.inject.Scopes$1$1.get(Scopes.java:65) 
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40) 
at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38) 
at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62) 
at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:84) 
at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254) 
at com.google.inject.internal.FactoryProxy.get(FactoryProxy.java:54) 
at com.google.inject.internal.SingleParameterInjector.inject(SingleParameterInjector.java:38) 
at com.google.inject.internal.SingleParameterInjector.getAll(SingleParameterInjector.java:62) 
at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:84) 
at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254) 
at com.google.inject.internal.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:46) 
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1031) 
at com.google.inject.internal.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:40) 
at com.google.inject.Scopes$1$1.get(Scopes.java:65) 
at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:40) 
at com.google.inject.internal.InjectorImpl$4$1.call(InjectorImpl.java:978) 
at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1024) 
at com.google.inject.internal.InjectorImpl$4.get(InjectorImpl.java:974) 

... 9 more 
Caused by: javax.xml.bind.JAXBException - with linked exception: 

java.lang.ClassNotFoundException: com/sun/tools/internal/xjc/api/XJC 
at org.apache.cxf.common.jaxb.JAXBUtils.createSchemaCompiler(JAXBUtils.java:679) 
at org.apache.cxf.common.jaxb.JAXBUtils.createSchemaCompilerWithDefaultAllocator(JAXBUtils.java:686) 

... 49 more 
Caused by: 

java.lang.ClassNotFoundException: com/sun/tools/internal/xjc/api/XJC 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Unknown Source) 
at org.apache.cxf.common.jaxb.JAXBUtils.createSchemaCompiler(JAXBUtils.java:672) 

... 50 more 

它是一個類加載的問題,因爲我使用的吉斯?沒有這個例外,該應用程序就像一個魅力。我可以做所有我需要做的Web服務:連接,切換URL,...所以我不希望這是原因。

除了注意:我覺得也沒關係現在在這裏,但我使用吉斯,當然,我的JNLP文件具有

<security> 
    </all-permissions> 
</security> 

標誌。

有沒有人有過這方面的經驗?也許我真的只是想念一件事,但任何幫助(一如既往;))高度讚賞:)

回答

1

終於我得到了classpath中的tools.jar。我發現它在我的jar文件清單中丟失了,並且包含了我的客戶端應用程序。

由於這是一個JavaFX應用程序,我需要添加客戶子模塊的清單文件中的配置類路徑標籤中的tools.jar依賴性:

 <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <configuration> 
       <archive> 
        <manifestEntries> 
         ... 
         <Class-Path>jfxrt.jar tools.jar</Class-Path> 
        </manifestEntries> 
        <manifest> 
         <addClasspath>true</addClasspath> 
        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 

有工具後。罐子在classpath中,CXF試圖調用java編譯器,看到錯誤消息:

org.apache.cxf.common.jaxb.JAXBUtils logGeneratedClassNames 
INFO: Created classes: <list of my generated JAVA files from the wsdl file here> 
[ERROR] IOException during exec() of compiler "javac". Check your path environment variable. 
Okt 23, 2012 3:46:20 PM org.apache.cxf.endpoint.dynamic.DynamicClientFactory createClient 
SEVERE: Could not compile java files for <url to wsdl file here>. 

因此,這意味着對我來說,我需要需要有JDK運行,併成立了客戶機上。如果我也爲javac服務(只是一個想法不要責怪我:)),這意味着我需要在客戶端機器上執行一些操作,這對我來說是不可行的。

對於我來說,我會找到一個替代方案來解決我最初想要的問題(解決方案將外包generate-ws-access-classes)。

雖然,對於如何在類路徑中集成tools.jar的初始問題,我上面寫的是爲我解決了這個問題。