目录:
注意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成功
请保持服务持续运行,以便后续客户端调用。
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.youkuaiyun.com/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.youkuaiyun.com/colinasd/article/details/52740854
3、Maven如何打包成jar,如何指定main函数的入口,以及生成对应的lib
https://blog.youkuaiyun.com/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>