2012-10-27 5 views
0

이것이 jax-ws 웹 서비스의 기본적인 예제이지만이 오류를 해결할 수는 없습니다. 나는이 튜토리얼을 따라 http://www.mkyong.com/webservices/jax-ws/deploy-jax-ws-web-services-on-tomcat/ 이며 war 파일을 ant를 사용하여 build.xml을 사용하여 만들었다. 하지만이 war 파일을 Apache Tomcat의 webapps 디렉토리에 붙여 넣으면 전개되지만이 URL localhost : 8084/HelloWorld/hello는 Error 404 (Apache Tomcat이 8084 포트에서 실행 중이다)를 제공한다.java.lang.LinkageError : JAX-WS 웹 서비스와 함께 부트 스트랩 클래스 로더에서 JAXB 2.1 API를로드 중입니다.

web.xml을

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, 
Inc.//DTD Web Application 2.3//EN" 
"http://java.sun.com/j2ee/dtds/web-app_2_3.dtd"> 

<web-app> 
    <listener> 
     <listener-class> 
       com.sun.xml.ws.transport.http.servlet.WSServletContextListener 
     </listener-class> 
    </listener> 
    <servlet> 
     <servlet-name>hello</servlet-name> 
     <servlet-class> 
      com.sun.xml.ws.transport.http.servlet.WSServlet 
     </servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>hello</servlet-name> 
     <url-pattern>/hello</url-pattern> 
    </servlet-mapping> 
    <session-config> 
     <session-timeout>120</session-timeout> 
    </session-config> 
</web-app> 

일 - jaxws.xml

<?xml version="1.0" encoding="UTF-8"?> 
<endpoints 
    xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" 
    version="2.0"> 
    <endpoint 
     name="HelloWorld" 
     implementation="com.mkyong.ws.HelloWorldImpl" 
     url-pattern="/hello"/> 
</endpoints> 

의 build.xml

<project name="HelloWorld" default="dist" basedir="."> 
    <description> 
     Web Services build file 
    </description> 
    <!-- set global properties for this build --> 
    <property name="src" location="src"/> 
    <property name="build" location="build"/> 
    <property name="dist" location="dist"/> 
    <property name="webcontent" location="WebContent"/> 

    <target name="init"> 
     <!-- Create the time stamp --> 
     <tstamp/> 
     <!-- Create the build directory structure used by compile --> 
     <mkdir dir="${build}"/> 
    </target> 

    <target name="compile" depends="init" 
    description="compile the source " > 
     <!-- Compile the java code from ${src} into ${build} --> 
     <javac srcdir="${src}" destdir="${build}"/> 
    </target> 

    <target name="war" depends="compile" 
    description="generate the distribution war" > 

    <!-- Create the war distribution directory --> 
    <mkdir dir="${dist}/war"/> 

    <!-- Follow standard WAR structure --> 
    <copydir dest="${dist}/war/build/WEB-INF/" src="${webcontent}/WEB-INF/" /> 
    <copydir dest="${dist}/war/build/WEB-INF/classes/" src="${build}" /> 

    <jar jarfile="${dist}/war/HelloWorld-${DSTAMP}.war" basedir="${dist}/war/build/"/> 
    </target> 

</project> 

HelloWorld.java : 나는 아래의 전쟁 파일의 내용을 포함했다

package com.mkyong.ws; 

import javax.jws.WebMethod; 
import javax.jws.WebService; 
import javax.jws.soap.SOAPBinding; 
import javax.jws.soap.SOAPBinding.Style; 

//Service Endpoint Interface 
@WebService 
@SOAPBinding(style = Style.RPC) 
public interface HelloWorld{ 

    @WebMethod String getHelloWorldAsString(); 

} 

HelloWorldImpl.java

package com.mkyong.ws; 

import javax.jws.WebService; 

//Service Implementation Bean 

@WebService(endpointInterface = "com.mkyong.ws.HelloWorld") 
public class HelloWorldImpl implements HelloWorld{ 

    @Override 
    public String getHelloWorldAsString() { 
     return "Hello World JAX-WS"; 
    } 
} 

내가 잘못

편집을 가고있는 곳을 지적 해주십시오 : 내가 가지고 톰캣 로그에 다음과 같은 예외 :

SEVERE: ContainerBase.addChild: start: 
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/HelloWorld]] 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154) 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633) 
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1105) 
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1664) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) 
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) 
    at java.util.concurrent.FutureTask.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletContainerInitializer 
    at java.lang.ClassLoader.findBootstrapClass(Native Method) 
    at java.lang.ClassLoader.findBootstrapClass0(Unknown Source) 
    at java.lang.ClassLoader.loadClass(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.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1629) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559) 
    at java.lang.ClassLoader.loadClassInternal(Unknown Source) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Unknown Source) 
    at org.apache.catalina.startup.ContextConfig.getServletContainerInitializer(ContextConfig.java:1655) 
    at org.apache.catalina.startup.ContextConfig.processServletContainerInitializers(ContextConfig.java:1565) 
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1273) 
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:878) 
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:369) 
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) 
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5173) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    ... 11 more 
Nov 4, 2012 5:25:35 PM org.apache.catalina.startup.HostConfig deployDirectory 
SEVERE: Error deploying web application directory F:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\HelloWorld 
java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/HelloWorld]] 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:904) 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:633) 
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1105) 
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1664) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) 
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) 
    at java.util.concurrent.FutureTask.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
+0

제발 누군가 도와주세요 웹 서비스를 개발하고 싶습니다. – user1717415

+0

코드가 정상적으로 보이므로 개미 빌드 구성이 잘못되었다고 생각됩니다. Tomcat을 시작하는 동안 로그에 오류/예외가 표시되지 않습니까? – kolossus

+0

답장을 보내 주셔서 감사합니다.내가 바람둥이 로그에 예외를 추가했습니다 – user1717415

답변

3

이 오류로 발생하는 프로그램이 필요로하는 라이브러리 버전과 JDK에서 기본적으로 제공되는 버전 사이의 불일치 결과. JAX-WS 2.2 (최소 2.2의 JAXB 버전 필요) 웹 서비스 예제를 실행하고 있지만 JDK 6 및 Tomcat 설치는 JAXB 버전 2.1과 함께 제공되므로 예외가 발생합니다.

이 문제를 해결하려면 JDK의 endorsed standards override mechanism을 사용하십시오. 기본적으로 JDK의 바닐라 설치 패키지의 일부로 패키지 된 기본 라이브러리/jars를 새로운 버전으로 덮어 쓸 수 있습니다.

  1. 다운로드 <JDK_HOME>이 JDK (내가 여기에 창을 추정하고 있습니다)의 설치 폴더를 참조하는 <JDK_HOME>\lib\endorsed 경로의 JAXB apiJAX-WS 도서관과 장소의 최신 사본. 해당 경로에 endorsed 폴더가 없으면 여기에 복사본을 새로 만듭니다.

  2. 동일한 다운로드를 사용자의톰캣 설치 경로에 사용하십시오. 이전과 마찬가지로 endorsed이 없으면 만듭니다.

당신은 당신이 JDK 버전 6 이하를 사용하는 경우

+0

답장을 보내 주신 고맙습니다. 나는 당신의 계단을 따라 갔고 연결 오류는 사라졌습니다 !! 하지만 이제는 다른 예외가 있습니다 (원래 질문에서 예외를 수정했습니다). – user1717415

+0

@ user1717415 두 가지 관련 이유로 인해 톰캣 시작이 실패 할 수 있습니다 1. jar'servlet.jar '은 tomcat 폴더 내의 둘 이상의 위치에 존재할 수 있습니다. 이것이 사실이 아닌지 확인하고 jar 파일이'TOMCAT_HOME/lib' 폴더에만 존재하는지 확인하십시오. – kolossus

+0

servlet-api.jar 파일이 TOMCAT_HOME/lib 폴더에만 포함되어 있습니다. – user1717415

0

을 갈 수 있어요. 그것을 업그레이드하십시오. JDK 세리온을 7로 업그레이드 한 후 동일한 문제가 발생했습니다.