views:

793

answers:

3

OK, I am developing a program which will be deployed to lots of machines (Windows, Linux, AIX, z/Linux, openVMS, etc.). I want that application to contain a SOAP web service, but I don't want to bundle tomcat or run a separate service for the services (I want them in the same process as the rest of the application).

Basically what I'm looking for is something where I can define a class (say WebServices). I'm OK with writing WSDL or any other kind of service description as well. The I want something like this:

SOAPServer server = makeMeASoapServer();
//do config on the server
server.add(new WebService(...));
server.listen(port);

Obviously the names and parameters will be different.

I've been looking at Axis, and it seems like it provides this, but I don't know what classes I need to use. Am I crazy in wanting this kind of behavior? I can't believe more people aren't looking for this, I do this all the time with embedded web services within .NET clients.

+6  A: 

Seems jdk 6.0 already comes with a jax-ws implementation, and a little server you can embed. I havn't figured out all the pieces but here's a start:

mkdir -p helloservice/endpoint/

helloservice/endpoint/Hello.java :

package helloservice.endpoint;

import javax.jws.WebService;

@WebService()
public class Hello {
  private String message = new String("Hello, ");

  public void Hello() {}

  public String sayHello(String name) {
    return message + name + ".";
  }
}

helloservice/endpoint/Server.java:

package helloservice.endpoint;
import javax.xml.ws.Endpoint;

public class Server {

    protected Server() throws Exception {
        System.out.println("Starting Server");
        Object implementor = new Hello();
        String address = "http://localhost:9000/SoapContext/SoapPort";
        Endpoint.publish(address, implementor);
    }

    public static void main(String args[]) throws Exception {
        new Server();
        System.out.println("Server ready...");

        Thread.sleep(5 * 60 * 1000);
        System.out.println("Server exiting");
        System.exit(0);
    }
}

Build the thing:

mkdir build
javac -d build helloservice/endpoint/*java
$JAVA_HOME/wsgen -d build -s build -classpath .  helloservice.endpoint.Hello

Run the thing:

java -cp  build helloservice.endpoint.Server

Somethings running on http://localhost:9000/SoapContext/SoapPort now. You can get the wsdl on http://localhost:9000/SoapContext/SoapPort?WSDL

Havn't gotten around to making a client yet..

nos
This is EXACTLY what I wanted. Thank you so much
tster
As an added bonus, this comes in the jax-ws project (part of Glassfish) and only requires Java 5.You cane download the releases here: https://jax-ws.dev.java.net/
tster
Seems you don't even need that if you're on suns jdk 6
nos
I think the wsgen command should be: wsgen -d build -s build/ -classpath build/ helloservice.endpoint.Hello
sixtyfootersdude
When I go to the first URL I just get this text: "Web ServicesNo JAX-WS context information available." Anyone getting the same thing? Is that what is supposed to be displayed? I am not sure...The second URL displays xml.. as expected.
sixtyfootersdude
+1  A: 

In addition to nos's great answer, I found a class in Apache axis called SimpleHTTPServer which I'm pretty sure does the same thing but only requires Java 1.5 for those of you stuck with 1.5

I'm not going to explore it since I'm going to use the other solution, so I haven't actually verified it does what I think it does, but I'm pretty sure it does.

tster
There's also Jetty (http://www.mortbay.org/jetty/) which can be run in embedded mode.
skaffman
A: 

Most(/all?) Java SOAP server implementations provide a Servlet (the javax.xml.ws.Endpoint approach in another answer does look a bit simpler though...). Some SOAP implementations you could consider are: Apache CXF: cxf.apache.org, Apache Axis2: ws.apache.org/axis2/ or Spring Web Servies: static.springsource.org/spring-ws/site/ .

The most popular embedded Java web server seems to be Jetty: jetty.mortbay.org/jetty/, you can configure wiki.eclipse.org/Jetty/Howto/Configure_Jetty it either programatically (using plain Java or Spring beans) or using a custom XML format.

Stefan L