第三章 配置更高效的web service开发环境
第三章 配置更高效的web service开发环境
本章主要内容:本章主要介绍了如何配置一个高效的web service 开发环境。
1.自动把类文件存放到Axis
到目前为止,对web service中java源码做的任何更改,都要重新拷贝到Axis服务器更改才能生效。这是一件很麻烦的事情。解决这个问题,可以通过配置eclipse使得类文件修改后自动存放在Axis服务器中:
然而,有一个难题:因为在eclipse工程中只能有一个文件夹作为输出(output)文件夹。幸运的是,为突破这个限制,eclipse提供了一种解决方案,通过链接到外部文件夹:
如何设置链接外部文件夹呢?右键单击工程并选择”New|Folder”.按照下图进行设置:
接下来我们设置输出文件夹(output folder),在Eclipse右键单击工程,选择”Properties”,然后选择”Java Build Path”,再选择”Source”tab页:
单击”Browse”并选择”out”文件夹。若提示删除已存在的”bin”文件夹”时,选择”OK”. 即删除默认的输出文件夹“bin”,因其不再被使用。
现在类文件被放入到了正确的位置。接下来要使得META-INF 文件夹在正确的位置建立,只需要在”src” 文件夹中创建一个”META-INF”文件夹即可:
把项目中”resources”文件夹重命名为META-INF,然后将其移到”src”文件夹中即完成了META-INF文件夹的创建。为验证,环境建立是否正确。只需要更改下代码,将输出结果字符串转换为大写字符:

public com.ttdev.ss.ConcatResponse concat(
com.ttdev.ss.ConcatRequest concatRequest0) {
String result = concatRequest0.getS1()+concatRequest0.getS2();
ConcatResponse response = new ConcatResponse();
response.setConcatResponse(result.toUpperCase());
return response;
}
}
现在启动Axis2服务器。运行客户端,输出如下图:
2.使改变立刻生效
让我们把刚才对代码的修改,撤销。如下图所示:
在Axis服务器运行时,代码更改后,输出结果会立刻生效吗?不会的。它将依然输出为:ABC123.这是因为默认情况下AXIS服务器只加载一次web service,它不会监视web service 文件的变化。但是方式是可配置的。按照下列方式更改配置文件c:\axis\conf\axis2.xml:
通过配置文件,认真的你可能已经发现除了热部署选项外还有热更新选项。它们之间有什么不同呢?下图进行了解释说明:
需要重启Axis服务器热更新选项才会生效。然后如下更改Java代码:

public com.ttdev.ss.ConcatResponse concat(
com.ttdev.ss.ConcatRequest concatRequest0) {
String result = concatRequest0.getS1()+concatRequest0.getS2();
ConcatResponse response = new ConcatResponse();
response.setConcatResponse("hello: "+result);
return response;
}
}
保存代码。将会看到Axis服务器重新部署你的服务:
运行客户端,输出如下:
这里需要注意的是,Axis server每10秒检测一次文件变化。所以在web service 从新部署前需要一些时间。
3.调试web service
在Eclipse 中调试web service,需要在Axis Server 启动前设置一下环境变量:
在这种方式下,axis服务器在Jvm调试模式下运行。JVM将监听8000端口的连接。以后,你可以设置eclipse连接这个端口。现在,设置一个断点:
选择”Open Debug Dialog”:
将看到如下窗口:
右键单击”Remote Java Application” 并选择 “new”.把这个配置命名为”Debug Axis”.选中SimpleService工程并设置端口为8000,如下图所示:
单击”Debug”连接到运行Axis 服务器的JVM。现在运行客户端访问web service。Eclipse会在断点处停止:
单击变量或者其他调试快捷键,进行程序的单步跟踪。在Debug窗口中单击关闭图标可退出debug模式:
进入debug模式必须在启动axis服务前设置环境变量。如果频繁的启动服务器,每次设置环境变量是很麻烦的。可以创建一个batch文件 c:\axis\bin\debug.bat:
有了新建立的batch文件,以后进入debug模式,直接运行此文件即可!O(∩_∩)O~
4.更加自动化的代码生成
目前,我们通过Code Generator向导从WSDL文件生成代码。如果我们更改了WSDL文件,我们必须重新运行一次Code Generator向导。这样是不是很麻烦呢?我们需要一个更自动化的代码生成过程。通过编辑build.xml,我们可以使工作更轻松(build.xml文件也是由Code Generator 生成的)。首先让我们来了解下build.xml的结构。一个build.xml文件包含了一个工程,这类似于Java文件中的一个类。一个工程包含一个或者多个目标(target).一个目标(target)类似于java类中的一个方法。一个目标(target)包含一个或者多个任务(tasks)。一个任务(task)类似于一个java方法中一个语句:
现在让我们编辑build.xml 文件:
接下来,你想用Ant运行文件build.xml。然而任务<wsdl2code>不是Ant内置的任务,因此Ant不知道如何去执行这个任务。这个任务的实现类是AntCodegenTask,这个实现类在c:\axis\lib\axis2-ant-plugin-1.3.jar中。告诉Ant <wsdl2code>任务是如何实现的,如下更改build.xml文件:p3-22
定义环境变量AXIS2_HOME,可以在Windows环境变量中定义也可以在Eclipse中定义。我们这里是在eclipse中定义的。选择”Window|Preferences|Ant|Runtime”,然后选择”Properties”标签页:
单击”Add Property”按钮,按照以下所示输入:
现在我们可以运行Ant了。为验证是否正常工作,重命名文件SimpleServiceSkeleton.java 为SimpleServiceImpl.java然后删除包中的其他java文件。同时也删除文件夹META-INF.
BUG提示:在Axis2 1.3中有一个bug。安装之后不能再eclipse中运行Ant。解决方法是,在上面的Ant Runtime窗口中,选择”Classpath”标签页并单击”Ant Home”,然后选择org.apache.ant 文件夹(c:\eclipse\plugins):
运行Ant,右键单击build.xml文件然后选择”Run As|Ant Build….”:
然后选择”generate-service”目标并单击”Run”:
在控制台中可以看到构建消息:
这时,刷新工程将会看到生成的java文件和文件夹META-INF下面的文件。现在,如果要更改了WSDL文件,我们紧紧需要运行一次build.xml文件即可。然而默认情况下,<wsdl2code>任务不会覆盖已经存在的文件。设置可覆盖,需要如下设置:

...
<target name="generate-service">
<wsdl2code
wsdlfilename="SimpleService.wsdl"
serverside="true"
generateservicexml="true"
skipbuildxml="true"
serversideinterface="true"
namespacetopackages="http://ttdev.com/ss=com.ttdev.ss"
targetsourcefolderlocation="src"
targetresourcesfolderlocation="src/META-INF"
overwrite="true"/>
</target>
</project>
但是这样做同时也引入了一个新的问题:如果你在SimpleServiceSkeleton中写入了一些服务代码,当你运行build.xml,这个文件也会被覆盖,那么你的实现代码就没有啦。如何解决呢?方法是,不在使用SimpleServiceSkeleton这个类。创建类SimpleServiceImple作为相同接口实现的替代类:
为了使用自定义的SimpleServiceImpl类作为web service的实现,需要了解下Axis服务器是如何知道哪个类是web service的实现类的。它是通过在service.xml中查找类名实现的:
你可以手工修改services.xml文件,当文件重新生成时,但是每次手工修改太麻烦并且容易忘记。最好的方法是让Ant自动完成这件事情:
运行Ant并刷新工程,检查service.xml文件,文件应该使用了自定义类SimpleServiceImple:

<service name="SimpleService">
<messageReceivers>
<messageReceiver mep="http://www.w3.org/ns/wsdl/in-out"
class="com.ttdev.ss.SimpleServiceMessageReceiverInOut" />
</messageReceivers>
<parameter name="ServiceClass">com.ttdev.ss.SimpleServiceImpl</parameter>
<parameter name="useOriginalwsdl">true</parameter>
<parameter name="modifyUserWSDLPortAddress">true</parameter>
<operation name="concat"
mep="http://www.w3.org/ns/wsdl/in-out">
<actionMapping>
http://ttdev.com/ss/NewOperation
</actionMapping>
<outputActionMapping>
http://ttdev.com/ss/SimpleService/concatResponse
</outputActionMapping>
</operation>
</service>
</serviceGroup>
5. 自动化生成客户端代码
生成客户端代码,跟生成服务端代码非常的类是:
删除client包中的所有文件除了自己创建的SimpleClient.java文件。运行build.xml并选择”generate-client”目标(target)。刷新工程你将看到生成的客户端代码。
为保证一切工作正常,启动Axis并运行客户端程序。应该能正常工作。
6.本章总结
通过在eclipse中设置输出文件夹(链接方式),省去了每次手工拷贝类文件到服务器上的麻烦。
可以通过配置Axis服务器使之可以实现热更新。即在服务器运行时,对代码的更改可以立即生效。
若调试web service,首先要使Axis server运行在JVM的调试模式下。在eclipse中配置debug并连接到JVM.
从WSDL文件中自动化生成代码过程,可以使用<wsdl2code>Ant 任务。一般情况下你想覆盖已经存在的文件。为了防止覆盖你自己的代码,自动生成的代码最好不要手工修改。创建自己的服务实现类并修改service.xml文件告知Axis 服务器使用这个类。