15

axis-java2wsdl ant タスクを使用して、Java クラスの 1 つから wsdl を作成しようとしていますが、クラスパスを正しく取得できません。

axis-ant.jar を $ANT_HOME/lib に、axis.jar を /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

axis-ant.jar が $ANT_HOME/lib にあるため、Ant は axis-java2wsdl タスクの定義を見つけることができますが、その jar が「ライブラリ」によって定義されたパス上にあるにもかかわらず、axis.jar でクラスを見つけることができません。

axis.jarを$ ANT_HOME / libにシンボリックリンクすることで、DefaultAuthenticatorを通過して他のクラスが見つからなかったので、これがクラスパスの問題であることはわかっています。すべてを $ANT_HOME/lib にシンボリックリンクすることなく、/usr/share/lib またはプロジェクトのローカル lib ディレクトリにある jar ファイルを taskdef に認識させるにはどうすればよいですか?

編集:

最終的に、次の行で 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でこれらのライブラリを定義できないことで私が間違っていることを誰かが教えてくれれば、私はまだ非常に感謝しています

4

6 に答える 6

16

一般に、これは機能します。ただし、どのクラスがどこにあるかを注意深く確認する必要があります。

タスク クラスをクラスローダー階層の上位にあるクラスローダー (CLASSPATH や ANT_HOME/lib など) にロードできる場合、classpathref は単純に無視されます。

詳細については、よくある質問のエントリをお読みください。

Ant のクラス ローダーの実装では、Java の委譲モデルを使用します。

ClassLoader クラスは委任モデルを使用して、クラスとリソースを検索します。ClassLoader の各インスタンスには、関連付けられた親クラス ローダーがあります。クラスまたはリソースを見つけるために呼び出されると、ClassLoader インスタンスは、クラスまたはリソース自体を見つけようとする前に、クラスまたはリソースの検索をその親クラス ローダーに委譲します。ブートストラップ クラス ローダーと呼ばれる仮想マシンの組み込みクラス ローダーは、それ自体は親を持ちませんが、ClassLoader インスタンスの親として機能する場合があります。

注: ランニングant -diagnostics も役立ちます

于 2009-01-27T06:58:13.630 に答える
5

ライブラリを追加するためのAntメカニズムは次のとおりです。

  • コマンドライン引数を介して-lib
  • ${user.home}/。ant/libに追加
  • $ {ant.home}/libに追加

それだけ。このマニュアルには、 system.library.dirプロパティの使用については何も記載されていません。おそらく、この目的のためにほとんど無視されています。

また、antをverboseモード(および-verbose)で実行して、内部で何が行われているかを確認します。

于 2009-01-27T05:05:36.027 に答える
1

最も単純なオプションを使用して、クラスパスを指定しないのはなぜ<taskdef>ですか?

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

または<classpath>、サブセット化する 2 番目のエントリを作成し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はあまり良い考えではなく、ほとんどの場合回避できます。

于 2009-01-27T17:12:37.027 に答える
1

matt bで言及されているように、 taskdef タスクでクラスパスを直接指定するとうまくいきます。私のプロジェクトでは、タスク定義ライブラリをプロジェクト フォルダーに含め、ant ビルド ファイルでクラスパスを指定して、他の開発 PC で簡単にセットアップできると便利です。次のタスク定義を使用します。

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

これは、1.7.0 より前のバージョンの ant では機能しない可能性があることに注意してください。

于 2010-09-27T12:09:47.170 に答える
1

ここからの回答とすべての部分的な情報を使用して、解決策を思いつきました。プロジェクトの lib フォルダー (具体的には mysql jdbc ドライバー) に必要な ant ファイルの jar を追加しました。次に、ユーザーのホーム .ant/lib フォルダーにコピーするセットアップ タスクを ant で実行すると、ant が失敗し、再起動のメッセージが表示されます。ユーザーに対して一度だけ失敗し、その後は毎回機能します。jar を新しいバージョンに更新すると難しいかもしれません...

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>

お役に立てれば

于 2010-12-07T13:33:50.047 に答える
0

*.jar を {ant.home}/libs にコピーしたときに同じ問題に遭遇し、-lib を使用して *.jar を見つけました。正常に実行されました。新しいjarをロードできないと思うので、テストします!

于 2013-04-15T07:46:50.747 に答える