`
bbwang8088
  • 浏览: 43997 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用CXF发布简单WebService学习汇总

阅读更多

目录:

注意1:本文中所呈现或使用到的代码及工具等路径视具体环境而定,并非绝对,请按照自己计算机配置情况做必要修改。

注意2:需要提前安装JDK,IDEA和CXF,具体安装方法请自行检索。并设置JAVA_HOME指向JDK安装目录,设置CXF_HOME指向CXF安装目录,并在系统环境变量path中追加下述文字:

%JAVA_HOME%\bin;%CXF_HOME%\bin;

 

0、工具软件介绍

1、基于Maven的pom文件CXF依赖包配置

2、简单WebService接口类、WebService实现类、WebService发布类编写

3、在IDEA开发环境中服务发布及wsdl访问

4、使用CXF\bin目录下的wsdl2java工具生成客户端代码

5、客户端访问WebService

6、maven导出可执行的jar包并使用jar包发布WebService

7、参考

 

0、工具软件介绍

 

系统环境:Windows7企业版64bit

开发工具:IntelliJ IDEA 2018.1.5 Community Edition

JDK:build 1.8.0_151-b12 64bit

CXF本地工具:apache-cxf-3.2.5

CXF依赖库:3.1.8

Spring依赖库:4.3.3.RELEASE

 

1、基于Maven的pom文件CXF依赖包配置

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.lida</groupId>
  <artifactId>webservice</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>webservice Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <properties>
    <spring.version>4.3.3.RELEASE</spring.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

    <!--spring-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context-support</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-rt-transports-http</artifactId>
      <version>3.1.8</version>
    </dependency>

    <!--web service 以下都是cxf必备的-->
    <!--org.apache.cxf.transport.servlet.CXFServlet-->
    <dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-rt-transports-http</artifactId>
      <version>3.1.8</version>
    </dependency>
    <!--不加这个包会报错Unable to locate spring NamespaceHandler for XML schema namespace [http://cxf.apache.org/jaxws]-->
    <dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-rt-frontend-jaxws</artifactId>
      <version>3.1.8</version>
    </dependency>
    <!--java实现webservice,不部署到tomcat,需要jetty包支持-->
    <dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-rt-transports-http-jetty</artifactId>
      <version>3.1.8</version>
    </dependency>

  </dependencies>
  <build>
    <finalName>webservice</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

 2、简单WebService接口类、WebService实现类、WebService发布类编写

 

WebService接口类

  

package tech.bbwang.cxf.webservice.demo.server;

        import javax.jws.WebParam;
        import javax.jws.WebService;

@WebService
public interface MyWebService {
    int add(@WebParam(name = "firstA")int a, @WebParam(name = "firstB")int b);
    int minus(@WebParam(name = "secondA")int a, @WebParam(name = "secondB")int b);
}
 

 

WebService实现类

  

package tech.bbwang.cxf.webservice.demo.server;

import javax.jws.WebService;

@WebService(endpointInterface = "tech.bbwang.cxf.webservice.demo.server.MyWebService")
public class MyWebserviceImpl implements MyWebService {
    @Override
    public int add(int a, int b) {
        System.out.println(a+"+"+b+"="+(a+b));
        return a+b;
    }

    @Override
    public int minus(int a, int b) {
        System.out.println(a+"-"+b+"="+(a-b));
        return a-b;
    }
}
 

 

WebService发布类

  

package tech.bbwang.cxf.webservice.demo;

import tech.bbwang.cxf.webservice.demo.server.MyWebserviceImpl;

import javax.xml.ws.Endpoint;

public class App {

    public static void main( String[] args ){
        String address="http://localhost:9090/cxf";
        Endpoint.publish(address,new MyWebserviceImpl());
        System.out.println("发布webservice成功");
    }
}
 

 

3、在IDEA开发环境中服务发布及wsdl访问

IDEA中直接在WebService发布类鼠标右键,Run App.main执行即可。

正常启动输出如下:

 

七月 06, 2018 9:31:31 上午 org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean buildServiceFromClass
信息: Creating Service {http://server.demo.webservice.cxf.bbwang.tech/}MyWebserviceImplService from class tech.bbwang.cxf.webservice.demo.server.MyWebService
七月 06, 2018 9:31:31 上午 org.apache.cxf.endpoint.ServerImpl initDestination
信息: Setting the server's publish address to be http://localhost:9090/cxf
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
发布webservice成功
 
我们可以通过访问 http://localhost:9090/cxf?wsdl 查看wsdl文件。
请保存为cxf-demo.wsdl至本地以备后用。

请保持服务持续运行,以便后续客户端调用。

 

4、使用CXF的wsdl2java工具生成客户端代码

假设上述cxf-demo.wsdl已保存至D:\100_download目录下

系统开始->输入cmd->打开命令行窗口。

输入以下命令以切换当前工作目录:

cd /d D:\100_download

 因为CXF已经注册至系统环境变量中,所以我们可以直接输入wsdl2java工具名而不需要指定其完整文件路径。

输入以下命令进行客户端代码生成:

D:\100_download>wsdl2java -p tech.bbwang.cxf.webservice.demo.client -d cxf\ D:\100_download\cxf.wsdl

命令结束后,我们在目录 D:\100_download\cxf下得到客户端代码

 

具体的wsdl2java工具的使用方法见最后参考。

 

5、客户端访问WebService

客户端访问类

 

package tech.bbwang.cxf.webservice.demo.client;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;


public class CxfWSClient {
    public static void main(String[] args) {
        MyWebserviceImplService wsl =  new MyWebserviceImplService();
        MyWebService ws = wsl.getMyWebserviceImplPort();
        System.out.println(ws.add(1, 2));
        System.out.println(ws.minus(1, 3));
    }
}

 

鼠标右键,Run CxfWSClient.main()执行程序。

 

正常输出如下:

七月 06, 2018 9:31:55 上午 org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean buildServiceFromWSDL
信息: Creating Service {http://server.demo.webservice.cxf.bbwang.tech/}MyWebserviceImplService from WSDL: file:/D:/100_download/cxf.wsdl
3
-2

 

6、Maven导出可执行的jar包并使用jar包发布WebService

Maven导出可执行的jar包需要在pom文件的中添加一下plugin配置,具体完成指定主函数和打包依赖jar包工作。

      <!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <classesDirectory>target/classes/</classesDirectory>
          <archive>
            <manifest>
              <!-- 主函数的入口 -->
              <mainClass>tech.bbwang.cxf.webservice.demo.App</mainClass>
              <!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 -->
              <useUniqueVersions>false</useUniqueVersions>
              <addClasspath>true</addClasspath>
              <classpathPrefix>lib/</classpathPrefix>
            </manifest>
            <manifestEntries>
              <Class-Path>.</Class-Path>
            </manifestEntries>
          </archive>
        </configuration>
      </plugin>

 

最后使用IEDA->View->Tool Windows->Maven Projects,打开工程的Maven视图,执行Lifecycle下的package动作。编译打包成功后,可以在工程目录下看到webservice.jar文件

[INFO] Building jar: D:\projects\dream-webservice\target\webservice.jar

 首先关闭IDEA中正在运行的WebService发布进程,否则与下述工作冲突,导致端口不可使用错误。

切换命令行窗口当前目录至webservice.jar包所在路径

cd /d D:\projects\dream-webservice\target\

 执行jar包运行命令

java -jar webservice.jar

 输出下述文字即为发布成功

发布webservice成功

 

此时,再次使用上述客户端运行,依旧可以得到相同结果

 

 7、参考

 

1、使用CXF将wsdl文件生成客户端代码命令

https://blog.csdn.net/zeb_perfect/article/details/47423795

 主要参考内容:

 

在命令行执行D:\100_download>wsdl2java -p tech.bbwang.cxf.webservice.demo.client -d cxf\ D:\1
00_download\cxf.wsdl

wsdl2java用法: 
wsdl2java -p com -d src -all  aa.wsdl 
-p  指定其wsdl的命名空间,也就是要生成代码的包名: 
-d  指定要产生代码所在目录 
-client 生成客户端测试web service的代码 
-server 生成服务器启动web  service的代码 
-impl 生成web service的实现代码 
-ant  生成build.xml文件 
-all 生成所有开始端点代码:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file. 
 需要注意的是在客户端代码执行过程中,还是需要访问wsdl文件,所以上述指定了绝对路径。

 

 

2、IDEA+maven+CXF+WebService

https://blog.csdn.net/colinasd/article/details/52740854

 

3、Maven如何打包成jar,如何指定main函数的入口,以及生成对应的lib

https://blog.csdn.net/oppoppoppo/article/details/61622207

主要参考内容:

 

      <!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <classesDirectory>target/classes/</classesDirectory>
          <archive>
            <manifest>
              <!-- 主函数的入口 -->
              <mainClass>tech.bbwang,cxf.webservice.App</mainClass>
              <!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 -->
              <useUniqueVersions>false</useUniqueVersions>
              <addClasspath>true</addClasspath>
              <classpathPrefix>lib/</classpathPrefix>
            </manifest>
            <manifestEntries>
              <Class-Path>.</Class-Path>
            </manifestEntries>
          </archive>
        </configuration>
      </plugin>
 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics