2012-10-22 2 views
1

다시 나입니다. 그리고 오늘 저는 이상한 문제에 봉착했습니다. 나는 정확하게 뭔가를 이해하지 못했거나 나무 앞에서 포레스트를 놓치고있다.JNLP : 클래스 경로에 tools.jar이 없습니다.

다음과 같은 시나리오 : 데스크톱 (항아리)와 애플릿 (브라우저 내부 JNLP)

  • 나는이 : 내가 JDK 1.7 나는 두 클라이언트 런타임을 필요
  • 에 번들로 자바 FX를 사용하고

    • Maven 프로젝트는
    • 내가
    • 내가 웹 서비스와 통신하는 제 의뢰인이 필요
    • , 즉 I'v을위한 프레임 워크로 CXF을 선택 부모 치어 다른 서브 모듈이 프로젝트에 대한 설정 (나는 t 필요 오 웹 서비스
    • 여기에

    wsConnector

  • 라는 자신의 받는다는 서브 모듈은 좀 더 환경 정보이다 '웹 서비스 물건에 연결'과 연결하기위한 런타임에 웹 서비스를) 전환 할 수 내 치어 미리보기 : 모든 웹 서비스 연결 물건에 대한 돌봐 다시 wsConnector 서브 모듈을 컴파일 할 수있는 내용은

    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" 
    

    은 내가 CXF가 필요로 JDK에서 tools.jar를 통합 할 필요가있다. 부모의 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 파일도 있음)의 deploy 디렉토리에 tools.jar도 있습니다.

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

    이제 내 문제입니다 : 내가 java -jar client.jar와 클라이언트를 실행하는 경우, 모든 작품 나는 JNLP 파일의 모양이있는 경우

    , 나는 항목을 찾을 수 있습니다. 그러나 HTML/JNLP 파일을 호출하면 ClassNotFoundException이 표시되며 tools.jar이 classpath에 없다는 것을 알 수 있습니다. 따라서 서버 또는 로컬 호스트에서 애플릿을 열어도 상관하지 않습니다. 그것이 내가 guice을 사용하고 같은 클래스 로딩 문제

    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 
    

    가 : 여기

    는 스택 트레이스입니까? 이 예외가 없으면 앱이 charme처럼 작동합니다. 내가해야 할 모든 웹 서비스를 할 수 있습니다 : 연결, URL 전환, ... 그래서 나는 그것이 이유라고 기대하지 않을 것입니다.

    주 외에 : 나는 여기에 문제가 지금,하지만, guice을 사용하고 같은 물론 내 JNLP 파일이

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

    플래그가되지 않습니다 생각합니다.

    경험이있는 사람이 있습니까?어쩌면 나는 진짜로 다만 놓친다, 그러나 어떤 도움 (항상);)) 높게 평가된다 :

    답변

    1

    마지막으로 나는 classpath에있는 tools.jar를 얻었다. 나는 그것이 제공하고 나의 클라이언트 어플리케이션을 포함하고있는 jar 파일의 매니페스트에 빠져 있음을 알게되었습니다. 이것은 자바 FX 애플리케이션이기 때문에

    , 나는 클라이언트 서브 모듈의 매니페스트 파일의 구성의 클래스 경로 태그 내에서 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> 
    

    을 도구를 가진 후. 그래서 내가이 JDK 실행을 갖고, 클라이언트 컴퓨터에 설정이 필요 할 필요가 있음을 나 수단

    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>. 
    

    : 클래스 패스에 항아리, CXF는 자바 컴파일러를 호출 오류 메시지가 표시하려고합니다. javac도 제공한다면 (생각 만해도 나를 비난하지는 마라. :)) 이것은 클라이언트 컴퓨터에서 뭔가를 실행해야한다는 것을 의미한다.

    즉, 내가 처음에 원했던 (솔루션은 생성 - 액세스 - 클래스를 아웃소싱 할 것입니다) 대체 솔루션을 찾을 것입니다.

    classpath에서 tools.jar을 통합하는 방법에 대한 초기 질문에 대해 위에서 작성한 내용은 저를위한 문제를 해결했습니다.