Error compilando WebService

Hola!
Estoy tratando de compilar un ejemplo, aunque hice mi WS, la duda me ha quedado porque los conceptos de Java que tengo como que estann cruzados

Tengo esta clase

//La interface
package juma.mohammad;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService
public interface Greeting {
         @WebMethod String sayHello(String name);
}

package juma.mohammad;

//---Otra clase---
import javax.jws.WebService;

@WebService(endpointInterface = "juma.mohammad.Greeting")
public class GreetingImpl implements Greeting {

        @Override
        public String sayHello(String name) {
                return "Hello, Welcom to jax-ws " + name;
        }

}

Al tratar de compilarla, compilo la que implementa elmetodo , consigo este error:

root@squezze:~/ws/juma/mohammad# javac GreetingImpl.java
GreetingImpl.java:6: cannot find symbol
symbol: class Greeting
public class GreetingImpl implements Greeting {
                                     ^
GreetingImpl.java:8: method does not override or implement a method from a supertype
        @Override
        ^
2 errors

Para mi eso estaba correcto por el asunto de la herencia pero parece que no. Esto lo tome de un ejemplo que alguien de aca me dio pero no puedo compilarlo.

Pueden darme alguna pista el porque el error?

Gracias

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de neko069

Tus anotaciones deben de ir

Tus anotaciones deben de ir en la implementación del WS, la interface no debe estar casada con ninguna anotación.
En el caso de la anotación @WebService bórrala de la interface, quita la de @Override y sustitúyela por la de @WebMethod

Imagen de ezamudio

Greeting

La bronca de compilación es porque únicamente mandas compilar la implementación, sin haber compilado la interfaz primero. Primero compila Greeting.java y luego GreetingImpl.java

Imagen de macaruchi

Lo hice como dices y como

Lo hice como dices y como quiera me da el mismo error.

Imagen de ezamudio

directorio

Es que creo que te metes al directorio donde está la clase y no deberías. Debes estar en el directorio raíz de los paquetes (ws si no me equivoco) y compilar juma/mohammad/Greeting*.java

Imagen de macaruchi

UHmm... en eso tienes razon

UHmm... en eso tienes razon me meto al directorio donde estan las clases. Voy hacerlo como dices ahora.
Tienes razon!! Funionco cmo dices . Me podrias explicar porque pasa esto , es decir, por el asunto de los paquetes no entendi muy bien.

Imagen de ezamudio

paquetes

Los paquetes sirven para organizar conjuntos de clases y no tener que usar nombres de clases excesivamente largos para evitar conflictos. Puede haber dos clases con el mismo nombre, siempre y cuando estén en distintos paquetes. El nombre completo de una clase incluye el paquete que la contiene. Es como su apellido, de alguna forma.

Cuando usas paquetes, el generador crea una estructura de directorios que refleja los paquetes y subpaquetes. En este caso al compilar tu clase y/o interfaz, te crea el subdirectorio juma y dentro de él te crea mohammad. Lo más recomendable es que hagas lo mismo con los fuentes, que es precisamente lo que hiciste: un directorio juma, un subdirectorio mohammad y ahí dentro pones tus fuentes de Java.

Lo que sigue es que compiles desde el directorio que contiene todos tus fuentes, llamémosle el directorio raíz (no es el raíz del filesystem, solamente de tus fuentes). Cuando compilas GreetingImpl, el compilador ve que depende de una interfaz llamada Greeting. Como no le pones paquete, infiere que debe estar en el mismo paquete de la clase que está compilando, o sea juma.mohammad, y busca entonces el directorio juma, subdirectorio mohammad, y encontrar ahí Greeting.class. Cuando compilas desde el raíz de fuentes pues funciona de maravilla. Pero si compilas tu clase corriendo javac desde juma/mohammad, no va a encontrar el Greeting, porque no está en donde debe (lo va a buscar juma/mohammad/juma/mohammad). De hecho es probable que en juma/mohammad tengas otro juma/mohammad, si es que pudiste compilar Greeting.java desde juma/mohammad.

Imagen de macaruchi

La clase me compilo bien con

La clase me compilo bien con el paquete pero me sale un error al generar esto

#>wsgen -s src -d build/classes -cp build/classes juma.mohammad.GreetingImpl

root@squezze:~/ws# wsgen -s src -d build/classes -cp build/classes juma.mohammad.GreetingImpl
Class not found: "juma.mohammad.GreetingImpl"

Me dice que la clase no la encontró pero esta compilada ahi

root@squezze:~/ws/juma/mohammad# ls -l
total 16
-rw-r--r-- 1 root root 171 Aug  1 10:20 Greeting.class
-rw-r--r-- 1 root root 678 Aug  1 10:20 GreetingImpl.class
-rw-r--r-- 1 root root 298 Aug  1 10:00 GreetingImpl.java
-rw-r--r-- 1 root root 346 Aug  1 09:52 Greeting.java
root@squezze:~/ws/juma/mohammad#
Imagen de ezamudio

classpath

y para qué le indicas que el classpath es build/classes si realmente es simplemente . ?

Imagen de macaruchi

Ok, lo cambien como dices

Ok, lo cambien como dices pero tengo esto ahora

root@squezze:~/ws# wsgen -s src -d build/classes -cp . juma.mohammad.GreetingImpl
Problem encountered during annotation processing;
see stacktrace below for more information.
com.sun.tools.internal.ws.processor.modeler.ModelerException: modeler error: The @javax.jws.WebMethod annotation cannot be used in with @javax.jws.WebService.endpointInterface element.
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceAP.onError(WebServiceAP.java:225)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceVisitor.annotationError(WebServiceVisitor.java:180)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceVisitor.checkForInvalidImplAnnotation(WebServiceVisitor.java:175)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceVisitor.verifyImplAnnotations(WebServiceVisitor.java:154)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceVisitor.visitClassDeclaration(WebServiceVisitor.java:127)
        at com.sun.tools.apt.mirror.declaration.ClassDeclarationImpl.accept(ClassDeclarationImpl.java:95)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceAP.buildModel(WebServiceAP.java:315)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceAP.process(WebServiceAP.java:256)
        at com.sun.mirror.apt.AnnotationProcessors$CompositeAnnotationProcessor.process(AnnotationProcessors.java:60)
        at com.sun.tools.apt.comp.Apt.main(Apt.java:454)
        at com.sun.tools.apt.main.JavaCompiler.compile(JavaCompiler.java:258)
        at com.sun.tools.apt.main.Main.compile(Main.java:1102)
        at com.sun.tools.apt.main.Main.compile(Main.java:964)
        at com.sun.tools.apt.Main.processing(Main.java:95)
        at com.sun.tools.apt.Main.process(Main.java:85)
        at com.sun.tools.apt.Main.process(Main.java:67)
        at com.sun.tools.internal.ws.wscompile.WsgenTool.buildModel(WsgenTool.java:204)
        at com.sun.tools.internal.ws.wscompile.WsgenTool.run(WsgenTool.java:112)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at com.sun.tools.internal.ws.Invoker.invoke(Invoker.java:105)
        at com.sun.tools.internal.ws.WsGen.main(WsGen.java:41)
error: compilation failed, errors should have been reported
root@squezze:~/ws#
Imagen de ezamudio

primer comentario

Ahora regresa al primer comentario, el que puso neko069, y haz lo que te dice.

Imagen de macaruchi

Hice exactamente lo que dice

Hice exactamente lo que dice Neko09 pero de igual forma me da el mismo error de arriba

package juma.mohammad;

public interface Greeting {
         public String sayHello(String name);
}

//
package juma.mohammad;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService(endpointInterface = "juma.mohammad.Greeting")
public class GreetingImpl implements Greeting {

        @WebMethod
        public String sayHello(String name) {
                return "Hello, Welcom to jax-ws " + name;
        }

}

Lo que el dice es que no puedo ligar estas dos clases. Pero no veo otra forma de agregarlo con tomcat. Cuando lo publique con Java directamente no hubo problema solo ...

import javax.xml.ws.Endpoint;
import hello.Hello;
public class SimpleHelloWS {
  public static void main(String[] args) {
    String endpointAddress = "http://localhost:8000/hello";
    Endpoint.publish(endpointAddress, new hello.Hello());
    System.out.println("El Servicio Web Hello se esta ejecutando..");
    System.out.println("WSDL: " + endpointAddress + "?wsdl");
  }
}

pero seguro esta forma no funciona para publicar con Tomcat

Imagen de neko069

Si entendí bien tu último

Si entendí bien tu último comentario, es que cuando metes tu war al tomcat, y lo despliegas, al momento de querer acceder a la URL donde se supone que está tu WS no lo encuentras, es cuando te sale el error ése de "el servicio XXX no está disponible", si es así, es simple, tomcat no levanta el WS porque no ejecuta tu método main; entonces, checa ésta liga y ahí te guias de qué te hace falta para que puedas acceder.
También encontré ésta liga a ver si te sirve
No cuentas como te fue ;¬)

Imagen de macaruchi

Ambas las tengo y si miras

Ambas las tengo y si miras los ejemplos que pongo son de la segunda liga que me enviaste que es el que estoy tratando de compilar. Estoy usando el segundo. EL problema no es realmente al momento de desplegar sino de compilar y generar el wsdl.
Basicamente hice lo mismo que ellos dicen, en el segundo, pero no me deja compilar las clases luego me dijiste que las interfaces no pueden tener anotaciones, raro porque en la liga 2 que me diste ,al == en la 1, ellos ponen las anotaciones en la interfaz, pero bueno de esa forma quitando las anotaciones pude compilar pero al generar el wsgen es que me da el error de que no se pueden usar webservices y webmethod, error arriba.

Imagen de neko069

No dije que no puedas ligar

No dije que no puedas ligar tus clases ( o tu interface con tu implementación) dije que tu interface no debe estar casada con ninguna anotación.
Tienes la interface Greeting entonces, sólo define tu método sayHello

public interface Greeting{
    void sayHello( String name){}
}

Y ya, en tu implementación debes entonces de colocar todo el rollo de anotaciones, en éste caso de los WS.
Del segundo error que tienes, del cual resumiré sólo el renglón interesante

com.sun.tools.internal.ws.processor.modeler.ModelerException: modeler error: The @javax.jws.WebMethod annotation cannot be used in with @javax.jws.WebService.endpointInterface element.

Ése error precisamente, es porque tienes tu interface con alguna anotación, y además la estás colocando de nuevo en tu implementación, y sospecho que es por la anotación @WebMethod

Si es así quita cualquier anotación de la interface como lo ejemplifiqué e inténtalo de nuevo

Imagen de macaruchi

package juma.mohammad; public

package juma.mohammad;
public interface Greeting {
         public String sayHello(String name);
}
//
package juma.mohammad;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService(endpointInterface = "juma.mohammad.Greeting")
public class GreetingImpl implements Greeting {
        @WebMethod
        public String sayHello(String name) {
                return "Hello, Welcom to jax-ws " + name;
        }
}

Lo hice asi y ahora me da esto al tratar de generar el wsgen

root@squezze:~/ws# wsgen -s src -d build/classes -cp . juma.mohammad.GreetingImpl
Problem encountered during annotation processing;
see stacktrace below for more information.
com.sun.tools.internal.ws.processor.modeler.ModelerException: modeler error: The @javax.jws.WebMethod annotation cannot be used in with @javax.jws.WebService.endpointInterface element.
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceAP.onError(WebServiceAP.java:225)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceVisitor.annotationError(WebServiceVisitor.java:180)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceVisitor.checkForInvalidImplAnnotation(WebServiceVisitor.java:175)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceVisitor.verifyImplAnnotations(WebServiceVisitor.java:154)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceVisitor.visitClassDeclaration(WebServiceVisitor.java:127)
        at com.sun.tools.apt.mirror.declaration.ClassDeclarationImpl.accept(ClassDeclarationImpl.java:95)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceAP.buildModel(WebServiceAP.java:315)
        at com.sun.tools.internal.ws.processor.modeler.annotation.WebServiceAP.process(WebServiceAP.java:256)
        at com.sun.mirror.apt.AnnotationProcessors$CompositeAnnotationProcessor.process(AnnotationProcessors.java:60)
        at com.sun.tools.apt.comp.Apt.main(Apt.java:454)
        at com.sun.tools.apt.main.JavaCompiler.compile(JavaCompiler.java:258)
        at com.sun.tools.apt.main.Main.compile(Main.java:1102)
        at com.sun.tools.apt.main.Main.compile(Main.java:964)
        at com.sun.tools.apt.Main.processing(Main.java:95)
        at com.sun.tools.apt.Main.process(Main.java:85)
        at com.sun.tools.apt.Main.process(Main.java:67)
        at com.sun.tools.internal.ws.wscompile.WsgenTool.buildModel(WsgenTool.java:204)
        at com.sun.tools.internal.ws.wscompile.WsgenTool.run(WsgenTool.java:112)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at com.sun.tools.internal.ws.Invoker.invoke(Invoker.java:105)
        at com.sun.tools.internal.ws.WsGen.main(WsGen.java:41)
error: compilation failed, errors should have been reported
root@squezze:~/ws#
Imagen de ezamudio

endpointInterface

Me parece que si a la anotación @WebService le indicas la endpointInterface, entonces NO le debes poner @WebMethod a los métodos. La razón es que le estás indicando una interfaz y por lo tanto lo que hará será publicar los métodos de la interfaz.

Esto lo infiero porque estoy revisando un web service que yo tengo y le puse @WebService pero sin lo de endpointInterface porque no implemento ninguna interfaz, y entonces le pongo a cada método anotaciones de WebMethod, WebParam y WebResult.

Probablemente para que funcione tu ejemplo lo que tienes que hacer es ponerle a tu implementación solamente la anotación de @WebService tal como la tienes, pero todo lo de @WebMethod va en la interfaz (pero la interfaz NO debe llevar anotación de WebService, solamente sus métodos llevan las decoraciones necesarias y probablemente puedas omitir @WebMethod).

Imagen de macaruchi

OK, ahi me funciono bastante

OK, ahi me funciono bastante bien en java mi problema es cuando trato de llevarlo a Tomcat. En java lo hice sin necesidad de interfaces solo hice la implementacion y corrio muy bien.

Imagen de neko069

Ejemplo WS en tomcat

Van mis ejemplos de cómo lo ejecuté en tomcat. De entrada necesitas un archivo llamado sun-jaxws.xml y se coloca en el mismo folder que el web.xml
El contenido de dicho xml es como sigue:

<?xml version="1.0" encoding="UTF-8"?>
<endpoints
 xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"
 version="2.0">
  <endpoint
     name="ServicioWeb" <!-- Aqui va el nombre de tu servicio web-->
      implementation="org.paquete.ws.ServicioWebImpl"   <!-- Aqui va el nombre de la clase que representa la implementacion de tu servicio web-->
      url-pattern="/servicioWeb"/>  <!-- y aquí pues el nombre del pattern-->
</endpoints>

Después va una modificación a tu web.xml debe quedar así:

<?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">
 
<!-- Obviamente cambias los nombres de los tags servlet-x por tu servicio web-->

<web-app>
    <listener>
        <listener-class>
                com.sun.xml.ws.transport.http.servlet.WSServletContextListener
        </listener-class>
    </listener>
    <servlet>
        <servlet-name>servicioWeb</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>servicioWeb</servlet-name>
        <url-pattern>/servicioWeb</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>120</session-timeout>
    </session-config>
</web-app>

Después, dentro del tomcat, incluyes los jar que vienen en la página de referencia de JAX-WS en éste link, en la ruta {CATALINA_HOME}/lib según nada más debes meter algunos, pero al levantar el gato, me marcaba errores por cuestiones de ClassNotFoundException y para no estar batallando, los metí todos.

Se supone que éso es suficiente para que, cuando levante tomcat, y accedas a una URL de tipo  http://{localhost o ip} : {puerto} / {nombre del war o contexto} / {webservice}?wsdl te aparezca en la ventana del explorador un xml representando tu WS.

Ojalá te sirva el ejemplo ( se aceptan galletas y dinero ) ;¬)