[Axis2] Code Generator 도구를 위한 명령 줄 Ant Task 개발 지침서

2024. 2. 5. 20:40이것저것

728x90

코드 생성기 도구는 command line 버전과 Ant Task 로 구성됩니다. 이 문서에는 명령줄과 Ant task에 대한 참고를 나열 할 것입니다. 또 이 문서에서 사용자 정의 Ant task를 이용한 파일 필드와 Ant에서 Code Generator를 호출하는 방법에 대해서 자세히 설명 합니다.

 

이 도구는 Axis2 Binary Distribution과 함께 번들로 제공됩니다.

 

목차

  • 소개
  • Command Line 버전
    • Option Reference
  • Ant Task
    • Ant Task 참조
    • 사용자 정의 Ant Task 용 빌드 파일 예제
    • Ant에서 Code Generator 호출
  • Appendix
  • 부록

 

소개

 

이 기본 도구는 WSDL2Code 클래스에 구현되었으며 Java(대부분의 경우)의 경우, 편의상 또 하나의 WSDL2Java클래스를 가지고 있습니다. 기본 클래스를 직접 실행하거나 스크립트 중 하나를 사용하여 WSDL2Code 및 WSDL2Java를 적절하게 실행하도록 선택할 수 있습니다. (스크립트는 표준 바이너리 배포판의 bin 디렉토리에 있습니다)

 

Command Line 버전

 

이 도구의 명령줄 버전을 사용하려는 사용자에게는 이 섹션이 도움이 될 것입니다.

 

Option Reference

사용법 WSDL2Code <option_reference>

E.g. :- WSDL2Code -uri <Location of WSDL>

언급된 이러한 옵션들 이외에도 -E(대문자) 접두사를 붙여 추가 옵션을 전달할 수 있습니다. 이러한 추가 옵션들은 확장 프로그램에 의해 처리될 것입니다. 전달할 수 있는 추가 옵션은 확장 문서(예: ADB 같은)와 별도 문서화되어 있습니다.

 

Ant Task

 

코드 생성기는 Ant task과 함께 번들로 제공됩니다.

Ant 작업은 org.apache.axis2.tool.ant.AntCodegenTask 클래스에 구현되어 있습니다.

다음은 Ant task 속성 값들입니다.

 

Ant Task 참고

 

사용자 정의 Ant 작업을 사용한 빌드 파일 예제

 

다음은 사용자 정의 Ant 작업을 사용하는 예제 Ant 빌드 파일입니다. wsdl 파일을 사용하여 예제를 테스트할 수 있습니다. 다음 스크립트에서 "CombinedService.wsdl"을 당신만의 wsdl 파일 이름으로 바꾸십시오.

<?xml version="1.0"?>
<project name="CodegenExample" default="main" basedir=".">

	<path id="example.classpath">
		<fileset dir="classes">
			<include name="**/*.jar" />
		</fileset>
	</path>
	
	<target name="declare" >
	<taskdef name="codegen"
		classname="org.apache.axis2.tool.ant.AntCodegenTask"
		classpathref="example.classpath"/>
	</target>
	
	<target name="main" depends="declare">
	
		<codegen
			wsdlfilename="C:\test\wsdl\CombinedService.wsdl"
			output="C:\output"
			serverside="true"
			generateservicexml="true"/>
	</target>

</project>
 

위 빌드 스크립트의 4~8행에서 classpath를 설정하고 모든 .jar 파일(아래 열거된)을 클래스 경로에 포함합니다.

10~15행에서는 "codegen"이라는 task을 선언하기 위한 target을 생성하고 12행에서 클래스 경로 내에 적절한 클래스(org.apache.axis2.tool.ant.AntCodegenTask)를 설정합니다.

17~23행에서는 "main" 타겟은 주어진 wsdl로부터 코드를 생성합니다. 19~22행에는 몇 가지 인수가 설정되어 있습니다. 여기 19행에서는 wsdl의 위치를 ​​설정합니다. 20번째 줄에서는 코드가 생성되는 출력 디렉터리를 설정합니다. 21행은 이 빌드가 서버 측 코드(스켈레톤)를 생성함을 나타내고 22행은 services.xml도 생성됨을 나타냅니다.

 

관련 인수들을 전달하여 알맞은 (클래스) 생성하게 해주는 code generation 도구가 내부적으로 실행하고 org.apache.axis2.tool.ant.AntCodegenTask 클래스를 사용해야 하는 "codegen" task을 사용하는 main target을 확인하십시오

 

사용자가 만약 다음 명령을 입력하면

>ant 혹은 >ant main

 

지정된 WSDL 파일(위 인스턴스에서는 C:\test\wsdl\CombinedService.wsdl)에 대한 서버를 위한 코드와 services.xml을 생성하고 생성된 코드는 지정된 출력 경로(C:\output- 위의 경우)에 기록됩니다.

For this Ant task to work the following jars need to be in the class path.

이 Ant task이 동작하려면 다음 jar 파일들이 클래스 경로에 있어야 합니다.

 

  • axis2-*.jar (from the Axis2 distribution)
  • wsdl4j-1.6.2.jar or higher (The WSDL4J implementation jar. Bundled with the Axis2 distribution)
  • stax-api-1.0.1.jar (javax.xml.namespace.QName 클래스를 포함하는 StAX API. 이 jar 파일은는 javax.xml.namespace.QName 구현을 포함하는 다른 jar로 대체될 수 있습니다. 그러나 Axis2는 Axis2 배포판과 함께 번들로 제공되는 stax-api-1.0.1.jar에 포함 된 이 클래스를 사용합니다.)
  • commons-logging-1.1.jar, neethi-2.0.jar and XmlSchema-1.2.jar (from the Axis2 distribution)
  • axiom-api-1.2.1.jar and axiom-impl-1.2.1.jar (from the Axis2 distribution)
  • activation-1.1.jar (from the Axis2 distribution)
  • wstx-asl-3.1.0.jar (from the Axis2 distribution)

 

Ant로부터 Code Generator 호출

 

사용자는 ant 클래스 경로를 변경하는 것이 다소 어렵다는 것을 알기때문에 더 쉬운 기법을 사용 할 수도 있습니다. 이 코드 생성기 기본 클래스는 빌드 파일을 통해 직접 호출할 수 있습니다.

아래 스크립트는 WSDL2Java를 실행하여 Java 소스 파일을 생성, 소스 컴파일, 배치 준비를 위한 AAR 파일을 빌드하는 데 필요한 통합 build.xml의 예입니다(이 작업은 빌드 파일에서 대상을 별도로 호출하여 하나씩 수행됩니다):

<!DOCTYPE project>
<project name="wsdl2java-example" default="usage" basedir=".">
	<property name="project-name" value="wsdl2java-example"/>
	<property file="build.properties"/>
	
	<property name="build" value="build"/>
	<property name="src" value="src"/>
	<property name="build.classes" value="build/classes" />
	
	<path id="axis.classpath">
		<pathelement location="build/classes" />
		<fileset dir="${axis.home}/lib">
			<include name="**/*.jar" />
		</fileset>
		<pathelement location="${build.classes}" />
	</path>
	
	<path id="axis_client.classpath">
		<pathelement location="build/classes" />
		<fileset dir="${axis.home}">
			<include name="**/*.jar" />
		</fileset>
		<fileset dir="lib">
			<include name="*.jar" />
		</fileset>
		<pathelement location="${build.classes}" />
	</path>
	
	<target name="usage" description="Build file usage info (default task)">
		<echo message=" " />
		<echo message="${project-name} " />
		<echo message="-------------------------------------------------------" />
		<echo message=" " />
		<echo message="Available Targets:" />
		<echo message=" " />
		<echo message=" Compiling:" />
		<echo message=" compile - Compiles the WSDL2Java source code" />
		<echo message=" " />
		<echo message=" Compiling client:" />
		<echo message=" compile_client - Compiles the client source code" />
		<echo message=" " />
		<echo message=" Cleaning up:" />
		<echo message=" clean - Delete class files" />
		<echo message=" " />
		<echo message=" WSDL:" />
		<echo message=" wsdl2java - Generate source from WSDL" />
		<echo message=" " />
		<echo message=" AAR:" />
		<echo message=" aar - Generate an .aar for deployment into WEB-INF/services" />
		<echo message=" " />
		<echo message=" Executing:" />
		<echo message=" runLogin - Execute the runLogin client" />
	</target>
	
	<target name="prepare" >
		<mkdir dir="${build.classes}" />
	</target>
	
	<target name="clean" >
		<delete dir="${build}" />
		<delete dir="${dist}" />
	</target>
	
	<target name="compile">
		<echo message="Compiling wsdl2 files"/>
		
		<javac
			srcdir="output"
			destdir="${build.classes}"
			deprecation="true"
			failonerror="true" debug="true">
			
			<classpath refid="axis.classpath"/>
		</javac>
	
	</target>
	
	<target name="wsdl2java" depends="clean,prepare">
		<delete dir="output" />
		<java classname="org.apache.axis2.wsdl.WSDL2Java" fork="true">
		<classpath refid="axis.classpath"/>
		<arg value="-d"/>
		<arg value="xmlbeans"/>
		<arg value="-uri"/>
		<arg file="wsdl/LoginEndpoint.wsdl"/>
		<arg value="-ss"/>
		<arg value="-g"/>
		<arg value="-sd"/>
		<arg value="-o"/>
		<arg file="output"/>
		<arg value="-p"/>
		<arg value="org.example.types"/>
	</java>
	
	<!-- Move the schema folder to classpath-->
	<move todir="${build.classes}">
		<fileset dir="output/resources">
			<include name="**/*schema*/**/*.class"/>
			<include name="**/*schema*/**/*.xsb"/>
		</fileset>
	</move>
	
	</target>
	
	<target name="jar_wsdl" depends="compile">
		<jar jarfile="lib/axis2_example_wsdl.jar" >
			<fileset dir="${build.classes}" />
		</jar>
	</target>
	
	<!-- build an .aar file for axis2 web services -->
	<target name="aar" depends="compile">
		<delete dir="${build.classes}/META-INF" />
		<mkdir dir="${build.classes}/META-INF" />
		<copy todir="${build.classes}/META-INF" >
			<fileset dir="output/resources" >
				<!-- axis2 web services definitions file -->
				<include name="services.xml"/>
			</fileset>
			<fileset dir="wsdl" >
				<include name="LoginEndpoint.wsdl"/>
			</fileset>
		</copy>
		<jar jarfile="dist/LoginEndpoint.aar" >
			<fileset dir="${build.classes}" />
		</jar>
	</target>
	
	<target name="compile_client">
		<echo message="Compiling client files"/>
	
		<javac
			srcdir="src"
			destdir="${build.classes}"
			deprecation="true"
			failonerror="true" debug="true">
			
			<classpath refid="axis.classpath"/>
		</javac>
	
	</target>
	
	<target name="runLogin" depends="prepare,compile_client" description="run simple Login client">
		<java classname="org.client.LoginClient" >
			<classpath refid="axis_client.classpath"/>
		</java>
	</target>

</project>
 

위의 build.xml 파일을 axis2 바이너리 배포판의 'bin' 디렉터리내에 배치하세요. 그런 다음 동일한 디렉터리에 build.properties 파일을 만들고 axis2 바이너리 배포판이 있는 위치 axis.home 경로를 지정합니다.

 

E.g. :- axis.home=C://Axis2//axis2-1.1-bin

 

위의 build.xml 예제에서는 'dist', 'lib' 및 'src'라는 세 개의 빈 디렉터리가 있다고 가정합니다.

 

다음은 문서/리터럴 스타일을 따르는 검증된 WSDL 문서입니다. 이 파일의 이름은 위의 WSDL2Java Ant 태스크에서 사용된 이름인 LoginEndpoint.wsdl 이름과 동일하게 설정합니다.

<?xml version="1.0" encoding="UTF-8"?>

<definitions 
	name="LoginService" 
	targetNamespace="http://login" 
	xmlns:tns="http://login"
	xmlns="http://schemas.xmlsoap.org/wsdl/" 
	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
	xmlns:ns2="http://login/types">

	<types>
		<schema targetNamespace="http://login/types" xmlns:tns="http://login/types"
			xmlns:soap11-enc="http://schemas.xmlsoap.org/soap/encoding/"
			xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
			xmlns="http://www.w3.org/2001/XMLSchema">
			
			<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
			<element name="returnWebLoginElement">
				<complexType>
					<sequence>
						<element ref="tns:soap_session_idElement"/>
						<element ref="tns:web_user_nameElement"/>
					</sequence>
				</complexType>
			</element>
			<element name="webLoginElement">
				<complexType>
					<sequence>
						<element ref="tns:user_nameElement"/>
						<element ref="tns:user_passwordElement"/>
					</sequence>
				</complexType>
			</element>
			<element name="user_nameElement" type="xsd:string"/>
			<element name="user_passwordElement" type="xsd:string"/>
			<element name="soap_session_idElement" type="xsd:string"/>
			<element name="web_user_nameElement" type="xsd:string"/>
		</schema>
	</types>
	
	<message name="LoginEndpoint_webLogin">
		<part name="parameters" element="ns2:webLoginElement"/>
	</message>
	<message name="LoginEndpoint_webLoginResponse">
		<part name="result" element="ns2:returnWebLoginElement"/>
	</message>
	
	<portType name="LoginEndpoint">
		<operation name="webLogin">
			<input message="tns:LoginEndpoint_webLogin" name="LoginEndpoint_webLogin"/>
			<output message="tns:LoginEndpoint_webLoginResponse" name="LoginEndpoint_webLoginResponse"/>
		</operation>
	</portType>
	
	<binding name="LoginEndpointBinding" type="tns:LoginEndpoint">
		<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
		<operation name="webLogin">
			<soap:operation soapAction="webLogin"/>
			<input name="LoginEndpoint_webLogin">
				<soap:body use="literal"/>
			</input>
			<output name="LoginEndpoint_webLoginResponse">
				<soap:body use="literal"/>
			</output>
		</operation>
	</binding>
	
	<service name="LoginService">
		<port name="LoginEndpointPort" binding="tns:LoginEndpointBinding">
		<soap:address location="http://localhost:8080/axis2/services/LoginService"/></port>
	</service>
</definitions>
 

위 LoginEndpoint.wsdl이라는 이름의파일을 'bin' 디렉토리 내에 있는 'wsdl' 디렉토리에 넣어주십시오. 위에 정의된 ant 작업(>ant wsdl2java)을 통해 wsdl2java 명령을 실행하면 'output'이라는 디렉터리가 생성됩니다.

이 디렉토리에는 WSDL2Java로 생성 된 소스가 포함 됩니다.

 

중요한 세부 사항은 XMLBean 클래스 파일도 또한 WSDL2Java, TypeSystemHolder.class에 의해 생성된다는 것입니다. 해당 파일은 위의 ant task에 의해 빌드/클래스에 배치되며 생성된 소스를 컴파일하는 데 필요합니다. 자주 발생하는 문제는 사용자가가 다음과 같은 오류를 만난다는 것입니다:

 

ClassNotFoundException : Cannot load SchemaTypeSystem. Unable to load class with name schemaorg_apache_xmlbeans.system.s68C41DB812F52C975439BA10FE4FEE54.TypeSystemHolder. Make sure the generated binary files are on the classpath.

ClassNotFoundException: SchemaTypeSystem을 로드할 수 없습니다. 
이름이 Schemaorg_apache_xmlbeans.system.s68C41DB812F52C975439BA10FE4FEE54.TypeSystemHolder인 
클래스를 로드할 수 없습니다. 
생성된 바이너리 파일이 클래스 경로에 있는지 확인하세요.
 

이 오류를 방지하려면 WSDL2Java에서 생성된 TypeSystemHolder.class를 클래스 경로에 넣어 줘야 합니다.

 

다음 단계는 생성된 Skeleton Java 소스 파일(웹 서비스)을 수정하는 것입니다. 생성된 이 파일은 null을 반환하므로 비즈니스 로직을 포함하도록 수정해야 합니다.

 

WSDL2Java 명령으로 LoginEndpoint.wsdl 파일을 실행한 다음, 다음 파일을 편집하십시오:

output/src/org/example/types/LoginServiceSkeleton.java
 

다음 코드가 존재 해야 합니다.

/**
* LoginServiceSkeleton.java
*
* This file was auto-generated from WSDL
* by the Apache Axis2 version: 1.0-RC4 Apr 28, 2006 (05:23:23 IST)
*/
package org.example.types;
/**
* LoginServiceSkeleton java skeleton for the axisService
*/
public class LoginServiceSkeleton {

	/**
	* Auto generated method signature
	* @param param0
	*/
	public login.types.ReturnWebLoginElementDocument webLogin
	(login.types.WebLoginElementDocument param0 )
	{
		//Todo fill this with the necessary business logic
		throw new java.lang.UnsupportedOperationException();
	}
}
 

이 파일의 내용을 WSDL2Java 및 예제 wsdl 파일에서 생성된 complex 유형을 사용하는 다음 내용으로 바꾸십시오:

/**
* LoginServiceSkeleton.java
*
* This file was auto-generated from WSDL
* by the Apache Axis2 version: 1.0-RC4 Apr 28, 2006 (05:23:23 IST)
*/
package org.example.types;
import login.types.ReturnWebLoginElementDocument;
import login.types.ReturnWebLoginElementDocument.*;
import login.types.WebLoginElementDocument;
import login.types.WebLoginElementDocument.*;

/**
* Auto generated java skeleton for the service by the Axis code generator
*/
public class LoginServiceSkeleton {

	/**
	* Auto generated method signature
	* @param webLoginElementDocument changed from param0
	*/
	public ReturnWebLoginElementDocument webLogin
		(WebLoginElementDocument webLoginElementDocument )
	{
	
		//Todo fill this with the necessary business logic
		System.out.println("LoginServiceSkeleton.webLogin reached successfully!");
		
		// Get parameters passed in
		WebLoginElement webLoginElement = webLoginElementDocument.getWebLoginElement();
		String userName = webLoginElement.getUserNameElement();
		String password = webLoginElement.getUserPasswordElement();
		System.out.println("LoginServiceSkeleton.webLogin userName: " + userName);
		System.out.println("LoginServiceSkeleton.webLogin password: " + password);
		
		// input paramaters would be used here
		
		// prepare output
		ReturnWebLoginElementDocument retDoc =
		ReturnWebLoginElementDocument.Factory.newInstance();
		
		ReturnWebLoginElement retElement = ReturnWebLoginElement.Factory.newInstance();
		
		retElement.setWebUserNameElement("joe sixpack");
		retElement.setSoapSessionIdElement("some_random_string");
		System.out.println("validate retElement: " + retElement.validate());
		
		retDoc.setReturnWebLoginElement(retElement);
		System.out.println("validate retDoc: " + retDoc.validate());
		
		System.out.println("LoginServiceSkeleton.webLogin returning...");
		
		return retDoc;
	}
}
 

다음 단계에서는 axis2.war이 배포되었고고 서블릿 컨테이너에서 확장되었다고 가정합니다.

 

'bin/lib' 디렉토리에 jar 파일인 axis2_example_wsdl.jar을 생성하는 예제 build.xml(>ant jar_wsdl)에서 'jar_wsdl' ant 태스크를 실행하십시오. 이 jar는 클라이언트를 컴파일하는 데 사용되며 서블릿 컨테이너에도 배치됩니다.

 

다음 단계는, 배포 가능한 axis2 웹 서비스를 생성하는 예제 build.xml(>ant aar)에서 'aar' ant task을 실행합니다. dist/LoginEndpoint.aar를 axis2/WEB-INF/services에 배치합니다. lib/axis2_example_wsdl.jar을 axis2/WEB-INF/lib에 배치합니다. 이 행복한 axis 페이지에 서비스가 올바르게 로드되었는지 확인하세요. 사용 가능한 작업 'webLogin'이 표시된 'LoginEndpoint' 서비스가 존재해야만 합니다.

 

마지막 단계는 클라이언트를 생성하고 실행하는 것입니다. src 디렉터리에 아래 내용을 포함하는 org.client.LoginClient.java 파일을 만듭니다:

package org.client;

import org.apache.axis2.AxisFault;

import login.types.ReturnWebLoginElementDocument;
import login.types.ReturnWebLoginElementDocument.*;
import login.types.WebLoginElementDocument;
import login.types.WebLoginElementDocument.*;
import org.example.types.LoginServiceStub;

/**
* Login.
*
*/
public class LoginClient {

	public static void main(String[] args) {
		try {
		
			System.out.println("webLogin, firing...");
			LoginServiceStub stub = new LoginServiceStub();
			
			WebLoginElementDocument webLoginElementDocument
				= WebLoginElementDocument.Factory.newInstance();
			WebLoginElement webLoginElement =
			WebLoginElement.Factory.newInstance();
			webLoginElement.setUserNameElement("joe");
			webLoginElement.setUserPasswordElement("sixpack");
			
			webLoginElementDocument.setWebLoginElement(webLoginElement);
			
			System.out.println("validate: " + webLoginElement.validate());
			stub.webLogin(webLoginElementDocument);
			
			ReturnWebLoginElementDocument returnWebLoginElementDocument 
				=stub.webLogin(webLoginElementDocument);
			
			System.out.println("Client returned");
			
			ReturnWebLoginElementDocument.ReturnWebLoginElement
			retElement = returnWebLoginElementDocument.getReturnWebLoginElement();
			
			System.out.println("WebUserName: " + retElement.getWebUserNameElement());
			System.out.println("SOAPSessionId: " + retElement.getSoapSessionIdElement());
			System.out.println("webLogin, completed!!!");
		
		} catch (AxisFault axisFault) {
			axisFault.printStackTrace();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
}
 

Now run the ant task 'runLogin' (>ant runLogin). The following output should appear:

이제 ant 작업 'runLogin'(>ant runLogin)을 실행해 보십시오. 다음 결과가 나타나야 합니다.

runLogin:
    [echo] running the webLogin client
    [java] webLogin, firing...
    [java] validate: true
    [java] Client returned
    [java] WebUserName: joe sixpack
    [java] SOAPSessionId: some_random_string
    [java] webLogin, completed!!!
 

부록

Eclipse 참조 - http://www.eclipse.org/

사용자 정의 Ant Task들 - http://ant.apache.org/manual/develop.html

 

이상.

 

728x90

'이것저것' 카테고리의 다른 글

톰캣 - 글자깨짐  (1) 2024.02.07
[윈도우]배치 파일 및 스크립트  (2) 2024.02.06
기업이 가장 기대하는 3대 컴퓨터 비전 기술  (0) 2023.04.15
해상도 및 DPI 문제 안내  (0) 2023.03.25
MariaDB 설치 - CentOS 7  (0) 2023.03.17