一个java2wsdl的使用,把一个.java文件生成为一个WSDL服务文件
WSDL(Web Services Description Language)
WSDL是Web Service的描述语言,用于描述Web Service的服务,接口绑定等
以下的错误环境,让我很好的了解一个.java文件如何生成一个.WSDL文件的过程,这种过程很像推理,很有意思
D:\Apache_SOAP\axis2-1.6.0-bin\axis2-1.6.0\samples\quickstart\src\samples\quicks
tart\service\pojo>%AXIS2_HOME%\bin\java2wsdl -cp . -cn samples.quickstart.servic
e.pojo.StockQuoteService -of StockQuoteService.wsdl
Using AXIS2_HOME: D:\Apache_SOAP\axis2-1.6.0-bin\axis2-1.6.0
Using JAVA_HOME: C:\Program Files\Java\jdk1.6.0
log4j:WARN No appenders could be found for logger (org.apache.axis2.util.Loader)
.
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" java.lang.ClassNotFoundException: samples.quickstart.
service.pojo.StockQuoteService
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at org.apache.axis2.description.java2wsdl.Java2WSDLUtils.namespaceFromCl
assName(Java2WSDLUtils.java:65)
at org.apache.axis2.description.java2wsdl.Java2WSDLUtils.schemaNamespace
FromClassName(Java2WSDLUtils.java:84)
at org.apache.ws.java2wsdl.Java2WSDLBuilder.getSchemaTargetNamespace(Jav
a2WSDLBuilder.java:120)
at org.apache.ws.java2wsdl.Java2WSDLBuilder.generateWSDL(Java2WSDLBuilde
r.java:211)
at org.apache.ws.java2wsdl.Java2WSDLCodegenEngine.generate(Java2WSDLCode
genEngine.java:60)
at org.apache.ws.java2wsdl.Java2WSDL.main(Java2WSDL.java:36)
开始解释java class类的加载过程:
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
通过URLClassLoader$1进行寻找(run)
at java.security.AccessController.doPrivileged(Native Method)
然后通过AccessController(访问权限控制类),赋予权限,让它有寻找的权限
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
由于赋予了doPrivileged动作,赋予了权限,所以可以去做findClass的动作,找到这个Class
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
找到Class之后,就要开始加载
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
找到Class之后,就要开始加载(两句都是加载,至于有什么不同,我没有深究,有机会再说)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
外部加载后,现在开始内部加载。
at java.lang.Class.forName0(Native Method)
加载和内部加载都Ok之后,现在就可以通过forName这个方法对Class进行调用(Native method 本地方法)
at java.lang.Class.forName(Class.java:247)
当然是用Clsss类里面的forName方法的调用
这个过程,我感觉可以很好的理解一个class类的寻找和加载过程。
加载类完后,开始生产WSDL生成过程:
at org.apache.axis2.description.java2wsdl.Java2WSDLUtils.namespaceFromCl
assName(Java2WSDLUtils.java:65)
首先从ClassName得到namespace(空间域名)
at org.apache.axis2.description.java2wsdl.Java2WSDLUtils.schemaNamespace
FromClassName(Java2WSDLUtils.java:84)
接着从ClassName得到schemaNamespace(空间域名模板)
at org.apache.ws.java2wsdl.Java2WSDLBuilder.getSchemaTargetNamespace(Jav
a2WSDLBuilder.java:120)
得到SchemaTargetNamespace(目标空间域名模板)
at org.apache.ws.java2wsdl.Java2WSDLBuilder.generateWSDL(Java2WSDLBuilde
r.java:211)
有了SchemaTargetNamespace(目标空间域名模板)就可以generateWSDL(生产WSDL服务文件)
at org.apache.ws.java2wsdl.Java2WSDLCodegenEngine.generate(Java2WSDLCode
genEngine.java:60)
开始生产
at org.apache.ws.java2wsdl.Java2WSDL.main(Java2WSDL.java:36)
最后调用main方法,执行
WSDL文件生成过程:从ClassName得到namespace和schemaNamespace,both of namespaches get SchemaTargetNamespace and then
generateWSDL, do generate, at of all ,fininshed.