9

(以下の編集を参照してください。)

クラスパスだけを使用できない理由は、Java以外のライブラリを管理する必要があり、Java以外のプロジェクトをコンパイルしているためです。

Mavenサイトのドキュメントに従って、antrun呼び出しでMaven依存関係を使用しようとしています。

http://maven.apache.org/plugins/maven-antrun-plugin/examples/classpaths.html

ページの下部:

<property name="mvn.dependency.jar" 
      refid="maven.dependency.my.group.id:my.artifact.id:classifier:jar.path"/>
<echo message="My Dependency JAR-Path: ${mvn.dependency.jar}"/> 

どうしようともこの作品は作れません。refidの内容の周りで${}を試しました。コロン、ピリオドなどを、考えられるあらゆる方法で区切り文字として試しました。

誰かが私にそのrefidがいくつかの一般的な依存関係のために実際にどのように見えるべきか教えてもらえますか?

編集:

お返事をありがとうございます。

シングルショットの例を使用すると、次のようになります。

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <executions>
      <execution>
        <id>create-messages</id>
        <phase>compile</phase>
        <configuration>
          <tasks>
            <property name="build.compiler" value="extJavac"/>
            <property name="compile_classpath" refid="maven.compile.classpath"/>
            <property name="runtime_classpath" refid="maven.runtime.classpath"/>
            <property name="test_classpath" refid="maven.test.classpath"/>
            <property name="plugin_classpath" refid="maven.plugin.classpath"/>

            <property name="log4j.jar" refid="log4j:log4j:jar"/>
            <echo message="Where is the Log4J JAR?: ${log4j.jar}"/>
          </tasks>
        </configuration>
        <goals>
          <goal>run</goal>
        </goals>
      </execution>
    </executions>
    <dependencies>
      <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.14</version>
      </dependency>
    </dependencies>
  </plugin>

そして、mvncompileを実行すると次のようになります。

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building Chat Component
[INFO]    task-segment: [compile]
[INFO] ------------------------------------------------------------------------
Downloading: http://<redacted>/content/groups/public/log4j/log4j/1.2.14/log4j-1.2.14.pom
2K downloaded
Downloading: http://<redacted>/content/groups/public/log4j/log4j/1.2.14/log4j-1.2.14.jar
358K downloaded
[INFO] [antrun:run {execution: create-messages}]
[INFO] Executing tasks
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Error executing ant tasks

Embedded error: Reference log4j:log4j:jar not found.
[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Fri Oct 16 14:54:19 PDT 2009
[INFO] Final Memory: 7M/80M
[INFO] ------------------------------------------------------------------------

編集(2):

リンクされたソースコードを見て、「mvn -Xcompile」と「Storing」のgrepを実行することにしました。これにより、保存されているログ出力が大量に表示されます。

興味深いのは、明示的に指定している依存関係がリストに表示されていないことと、表示されているエントリの1つに基づいてキーに切り替えるとエラーが発生することです。

4

6 に答える 6

9

SingleShotがリンクしたコードと、それが機能するまでランダムに突っついたことに基づいて、この問題を「機能」させた方法を次に示します(非常に希薄な感じがするため、引用符で囲みます)。

正しく機能させる方法は次のとおりです。

<property name="log4j_location" 
                value="${maven.dependency.log4j.log4j.jar.path}"/>
<echo message="${log4j_location}"/>

注意すべきいくつかの重要なこと:antプロパティを設定する際のrefidとしてMaven依存関係を使用することはできません。Maven var値を取得するには、${}を使用する必要があります。

依存関係は最上位の依存関係リストに含まれている必要があるようです。log4jをantrunプラグインの依存関係にすると、プラグインに公開されません。

パス区切り文字はすべてドット(。)であり、コロン(:)はありません。そのため、最終的に自分の答えが正しいかどうかを確認しました。

Soapbox:

MavenがMavenプラグインでAntを使用することを検討している人、またはさらに良いことに、代わりにIvyでAntを使用することを強くお勧めします。

この特定の問題は、Mavenで標準外のことを行うことに関連する非常にばかげたレベルの難しさの輝かしい例です。

これは、Maven2に基づくビルドシステム全体を実装し、Antにいくつかのビルドシステムも実装したことを意味します。私はMaven2とAntの両方を、Java、Flex / AS3、C#、C++を含む複雑なビルドで使用しました。Mavenは、他の言語のプロジェクトに外部依存関係がないJavaプロジェクトに適しています。

Mavenは、Antによって暗黙的に対処されないいくつかの事柄に対処しますが、事前の計画により、Antははるかに柔軟で、文書化され、バグの少ないツールになります。

antルートを使用する場合は、プロジェクトの構造を定義し、依存関係システムを把握してください(1つ使用)。

ビルドシステムの修正に時間をかけないので、最終的にはMavenよりもはるかに幸せになると思います。

于 2009-10-19T17:45:51.930 に答える
4

上記のAaronH.の回答の補足として、プラグインのバージョンを1.3に設定して、実際に機能させる必要がありました。私は特定のバージョンなしでそれを使用していて、1.1を取得していました(何も機能していないようです)。


      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.3</version>
        ...
      </plugin>
于 2009-10-23T00:28:26.710 に答える
2

POMに入力した内容の例がなければ、言うのは難しいですが、具体的な例を考えてみてください。POMがlog4j(groupId = log4j、artifactId = log4j)を参照しているとしましょう。これが、AntファイルでそのJARを参照する方法だと思います。

<property name="log4j.jar" refid="maven.dependency.log4j:log4j:jar.path"/>
<echo message="Where is the Log4J JAR?: ${log4j.jar}"/>

理想的には、特定のJARを参照する必要はありませんが、プラグインのドキュメントがややまばらであることが示すように、適切なスコープのクラスパス全体を参照する必要があります。

<dependency>それでも問題が解決しない場合は、使用しているMavenPOM依存関係のタグを投稿してください。具体的に説明します。

プラグインのコードを見て確認しました。

于 2009-10-16T21:46:06.233 に答える
2

これは私のために働きます。

<copy file="${javax.mail:javax.mail-api:jar}" todir="tomcat/lib" />
<copy file="${org.springframework:spring-instrument-tomcat:jar}" todir="tomcat/lib" />
<copy file="${postgresql:postgresql:jar}" todir="tomcat/lib"/>

http://maven.apache.org/plugins/maven-antrun-plugin/examples/classpaths.htmlには、antクラスパスから依存関係を参照する方法の説明があります。

于 2012-11-07T19:26:04.860 に答える
1

ドキュメントにバグがあります。パスは次の形式である必要があります。

<property name="mvn.dependency.jar" 
  value="${maven.dependency.my.group.id.my.artifact.id.classifier.jar.path}"/>

したがって、log4j依存関係の正しいキーは次のようになります。

maven.dependency.log4j.log4j.jar.path

また、ではvalue=なくする必要があるrefid=ため、完全なプロパティは次のようになります。

<property name="log4j.jar" 
      value="${maven.dependency.log4j.log4j.jar.path}"/>
<echo message="My Dependency JAR-Path: ${log4j.jar}"/> 
于 2009-11-02T13:08:16.683 に答える
0

私は既存のアリを持っており、それを呼び出すために(新しい)Mavenを使用することを計画しました。はっきり覚えていないかもしれない問題に遭遇しましたが、それはおそらくあなたと同じように、クラスパスに関連しています。

問題は、私たちが毎日使用している「ant」は、XNIXとWindowsの両方でクラスパスを設定するシェルスクリプトであるということです。私はそれによって設定されたクラスパスとMavenで利用可能なパスを比較していませんが、私のテストでは、それらが一致せず、Mavenから渡されたいくつかのパスでantが実行されないことが示されました。

私が使用しているのは「exec-maven-plugin」であり、いくつかの引数が適用された外部プログラムとしてantを実行します。これは確実に機能しますが、依存関係が追加されます。

于 2012-08-15T07:22:56.230 に答える