문제

Axis-Java2WSDL ANT 작업을 사용하여 Java 클래스 중 하나에서 WSDL을 생성하려고하지만 ClassPath를 올바르게 얻을 수는 없습니다.

Axis-Ant.jar를 $ ant_home/lib 및 axis.jar in/usr/share/java로 설치하는 Ubuntu의 Libaxis-Java 패키지를 사용하고 있습니다. 내 build.xml의 흥미로운 부분은 다음과 같습니다.

<property name="library.dir" value="lib"/>
<property name="system.library.dir" value="/usr/share/java"/>
<path id="libraries">
    <fileset dir="${library.dir}">
        <include name="*.jar"/>
    </fileset>
    <fileset dir="${system.library.dir}">
        <include name="*.jar"/>
    </fileset>
</path>

<target name="genwsdl" depends="compile">
    <taskdef resource="axis-tasks.properties" classpathref="libraries"/>
    <axis-java2wsdl>
            details omitted
    </axis-java2wsdl>
</target>

달리기 ant genwsdl 결과 :

/build.xml:50: taskdef A class needed by class
org.apache.axis.tools.ant.wsdl.Wsdl2javaAntTask
cannot be found: org/apache/axis/utils/DefaultAuthenticator

ANT는 Axis-ant.jar가 $ ant_home/lib에 있지만 Axis-Java2wsdl 작업의 정의를 찾을 수 있지만 Axis.jar에서는 "라이브러리"에 의해 정의 된 경로에 있더라도 Axis.jar에서 클래스를 찾을 수 없기 때문입니다.

Symlinking Axis.jar가 $ ant_home/lib로 찾을 수없는 다른 클래스에 대한 기본 조정기를 지나갈 수 있었기 때문에 ClassPath 문제라는 것을 알고 있습니다. 모든 것을 $ ant_home/lib로 동조하지 않고/usr/share/lib 또는 내 프로젝트의 로컬 LIB 디렉토리에서 JAR 파일을 인식하려면 어떻게해야합니까?

편집하다:

마침내이 라인으로 WSDL을 성공적으로 생성 할 수있었습니다.

ant -lib /usr/share/java/axis.jar -lib /usr/share/java/jaxrpc.jar -lib /usr/share/java/wsdl4j.jar -lib /usr/share/java/commons-logging.jar -lib /usr/share/java/commons-discovery.jar -lib build genwsdl

누군가가 Build.xml에서 해당 라이브러리를 정의 할 수 없을 때 내가 잘못하고있는 일을 말해 줄 수 있다면 여전히 감사하겠습니다.

도움이 되었습니까?

해결책

일반적으로 이것은 작동합니다. 그러나 어떤 클래스가 어디에 있는지 매우 신중하게 확인해야합니다.

클래스 로더 계층 구조 (ClassPath 또는 ant_home/lib)에서 작업 클래스를 클래스 로더에 더 높은 클래스 로더에로드 할 수 있다면 ClassPathRef가 무시됩니다..

읽기 FAQ 항목 자세한 사항은.

Ant의 클래스 로더 구현이 사용됩니다 Java의 대표 모델

클래스 로더 클래스는 대표 모델을 사용하여 클래스와 리소스를 검색합니다. 클래스 로더의 각 인스턴스에는 관련 상위 클래스 로더가 있습니다. 클래스 또는 리소스를 찾도록 요청되면 클래스 로더 인스턴스는 클래스 또는 리소스 자체를 찾기 전에 클래스 또는 리소스 검색을 부모 클래스 로더로 위임합니다. 부트 스트랩 클래스 로더라고하는 가상 머신의 내장 클래스 로더는 자체가 부모가 없지만 클래스 로더 인스턴스의 부모 역할을 할 수 있습니다.

참고 : 실행 ant -diagnostics 도울 수 있습니다.

다른 팁

개미 기구 라이브러리 추가는 다음과 같습니다.

  • 명령 줄 인수 -LIB를 통해
  • $ {user.home}/. ant/lib에 추가
  • $ {ant.home}/lib에 추가

뿐. 그만큼 수동 사용에 대해 언급하지 않습니다 System.library.dir 재산. 아마도이 목적을 위해 거의 무시할 수 있습니다.

또한, 장점 모드 (및 -verbose)로 개미를 실행하여 후드 아래에서 무엇을하고 있는지 확인하십시오.

가장 간단한 옵션을 취하고 ClassPath를 지정하지 않겠습니까? <taskdef>?

<taskdef resource="axis-tasks.properties">
    <classpath>
        <fileset file="/path/to/axis/jars"/>
    </classpath>
</taskdef>

또는 두 번째를 만듭니다 <classpath> 그 서브 세트 입력 library.dir?

<path id="axis-tools-classpath">
    <fileset dir="/path/to/axis/home">
        <include name="*.jar"/>
    </fileset>
    <path refid="library.dir"/>
</path>

주위를 엉망으로 만들었습니다 ${ant.home}/lib 그런 좋은 생각이 아니며 거의 항상 피할 수 있습니다.

Menstioned와 같이 TaskDef 작업에서 직접 클래스 경로를 지정하는 것이 좋습니다. 매트 b. 내 프로젝트의 경우 프로젝트 폴더에 TaskDef 라이브러리를 포함시키고 ANT 빌드 파일에 클래스 경로를 지정하여 다른 개발 PC를 단순히 설정하는 것이 유용합니다. 다음과 같은 작업을 사용합니다.

<taskdef resource="antenna.properties" classpath="${myprojectroot}/lib/antenna-bin-1.2.1-beta.jar"/>

이것은 1.7.0보다 초기에 개미 버전에서는 효과가 없을 수 있습니다.

여기의 답변과 모든 부분 정보를 사용하여 솔루션을 생각해 냈습니다. 프로젝트의 LIB 폴더 (특히 MySQL JDBC 드라이버)에 필요한 개미 파일을 추가했습니다. 그런 다음 ANT에서 사용자의 홈 .ant/lib 폴더에 복사하는 설정 작업을 실행 한 다음 다시 시작할 메시지와 함께 Ant가 실패합니다. 사용자에게는 한 번만 실패한 다음 매번 작동합니다. 항아리를 새 버전으로 업데이트하면 까다로울 수 있습니다 ...

ANT build.xml은 다음과 같습니다.

<project name="data_source" default="build">

  <!-- BUILD PROPERTIES -->
  <property file="build.properties"/>

  <!-- SQL Server Properties -->
  <property name="sql.driver" value="org.gjt.mm.mysql.Driver"/>
  <property name="sql.url" value="jdbc:mysql://127.0.0.1/datastore"/>
  <property name="sql.user" value="user"/>
  <property name="sql.pass" value="password"/>

  <!-- FILE LOCATIONS  -->
  <property name="sql.dir" location="sql"/>

  <!-- INITIALIZE PROJECT -->
  <target name="init" description="Initialize the project">
      <available property="no.ant.lib.dir" file="${user.home}/.ant/lib/" type="dir" />
  </target>

  <!-- SETUP MYSQL -->
  <target name="setup_mysql" description="Copy the lib so ant can see it" unless="no.ant.lib.dir">
      <mkdir dir="${user.home}/.ant"/>
      <mkdir dir="${user.home}/.ant/lib"/>
      <copy file="lib/mysql-connector-java-5.1.13-bin.jar" todir="${user.home}/.ant/lib"/>

      <!-- ant already missed picking up the jar - we have to restart -->
      <fail message="JDBC mysql class copied to ${user.dir}/.ant/lib/ - please restart ant" />
  </target>

  <!-- BUILD DATA SOURCES -->
  <target name="build" depends="init,setup_mysql,clean_data" description="Create and populate tables">

    <sql driver="${sql.driver}" url="${sql.url}" userid="${sql.user}" password="${sql.pass}" >
      <transaction src="${sql.dir}/create_tables.sql"/>
      <transaction src="${sql.dir}/insert_data.sql"/>
    </sql>
  </target>

   <!-- CLEAN PROJECT -->
  <target name="clean" description="Cleans up project build">
    <!-- Don't clean data sources here - may get called by accident -->
  </target>

  <!-- Delete all tables and data -->
  <target name="clean_data" description="Deletes all data and tables">
    <echo>Dropping all database tables in ${sql.schema}...</echo>
    <property name="exec.command" value="mysqldump -u${sql.user} -p${sql.pass} --add-drop-table --no-data ${sql.schema} | grep ^DROP | mysql -u${sql.user} -p${sql.pass} ${sql.schema}" />
    <exec executable="sh">
      <arg value = "-c"/>
      <arg value="${exec.command}"/>
    </exec>

  </target>

</project>

도움이 되었기를 바랍니다

a *.jar를 {ant.home}/libs에 복사 할 때도 같은 문제를 충족 한 다음 *.jar를 찾으려면 -lib를 사용합니다. 나는 그것이 새로운 항아리를로드 할 수 없다고 생각한다. 그러면 나는 그것을 테스트 할 것이다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top