4

私の仕事では、一部の Java プロジェクトで AspectJ を使用しています。これをantビルドで動作させるために、ant/lib/内にaspectjtools.jarを配置しています。

私は現在、特定の Java プロジェクトに取り組んでおり、aspectJ の新しいバージョンを使用する必要があります。プロジェクトを使用するすべての人に、aspectjtools.jar のローカル コピーを更新してもらう必要はありません。代わりに、新しいspectjtools.jarをプロジェクトのlibディレクトリに追加し、次の行をbuild.xmlに追加してみました。

  <taskdef
     resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties"
     classpath="./lib/aspectjtools.jar" />

ただし、ANT クラスローダーは、タスク定義クラスパスで指定した jar に優先して ant/lib/ から jar をロードするため、これは期待どおりに機能しません。

代わりに、プロジェクトにチェックインされた jar を選択するように ant に強制する方法はありますか?

4

3 に答える 3

3

クラスパスで新しいjarを使用するようにiajcコンパイルターゲットを更新することはできませんか?

クラスローダに特定の jar ファイルを別の jar ファイルよりも優先させることはできません。同じクラスの複数のバージョンに関連付ける必要がある場合は、OSGI を検討する必要があります。

最も簡単な解決策は、プロジェクトまたは Maven/Ivy リポジトリのライブラリを使用し、グローバル ant フォルダー内のライブラリを無視することです。

例:

 <taskdef 
     resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties">
      <classpath>
         <pathelement location="${basedir.dir}/lib/aspectjtools.jar"/>
      </classpath>
 </taskdef>

 <target name="compile" >
    <iajc outjar="demo.jar">
        <sourceroots>
            <pathelement location=”src” />
        </sourceroots>
        <aspectpath>
            <pathelement 
              location="aspects_to_be_weaved_with_classes_in_sourceroots.jar" />
        </aspectpath>
        <classpath>
            <pathelement location="${basedir}/lib/aspectjrt.jar"/>
        </classpath>
    </iajc>
  </target>

更新: 別の Ant も使用する必要があります。Eclipse を使用している場合は、バンドルされているものを Ant ビューから直接試してください。

別のオプションもありますが、少し難しくなります。つまり、代わりに AspectJ の読み込み時ウィービングを使用します。その場合は、通常のコンパイル タスクでコンパイルできますが、起動時に JVM エージェントでウィービングを行う必要があります。詳細については、こちらをご覧ください。

これが役立つことを願っています!

于 2010-05-13T16:46:44.803 に答える
3

私の質問に対する最終的な答えはノーです。現時点では、ANT がプロジェクトのタスク jar を ANT lib ディレクトリ内のタスク jar よりも優先して使用する方法はありません。

于 2010-07-03T16:27:42.403 に答える
1

これは可能です。新しいクラスローダーを作成するには、この追加のタスクを利用する必要があります

http://enitsys.sourceforge.net/ant-classloadertask/

    <!--Append the dependent jars to the classpath so we don't have to install them in the ant directory-->
    <taskdef resource="net/jtools/classloadertask/antlib.xml"
             classpath="${basedir.dir}/lib/ant-classloadertask.jar"/>

    <classloader loader="ant.aspectj.loader" parentloader="project">
        <classpath>
            <pathelement location="${basedir.dir}/lib/aspectjtools.jar"/>
            <pathelement location="${basedir.dir}/lib/ant-classloadertask.jar"/>
        </classpath>
        <antparameters parentfirst="false"/>
        <handler loader="org.apache.tools.ant.AntClassLoader" adapter="org.apache.tools.ant.taskdefs.classloader.adapter.AntClassLoaderAdapter"/>
    </classloader>

    <taskdef resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties"
             classpath="${basedir.dir}/lib/aspectjtools.jar""
             loaderref="ant.aspectj.loader"/>
于 2012-04-16T18:22:10.827 に答える