9

(请参阅下面的编辑。)

我不能只使用类路径的原因是因为我需要管理一些非java库,并且我正在编译一个非java项目。

我正在尝试在 antrun 调用中使用 maven 依赖项,遵循 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 应该是什么样子?

编辑:

感谢您的回复。

使用您的示例 SingleShot,我有以下内容:

<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>

这是我在运行 mvn compile 时得到的:

[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 -X compile”并为“Storing”运行 grep,这会显示一堆日志输出,其中存储了一些东西。

有趣的是,我明确指定的依赖项没有显示在列表中,并且当我根据我看到的条目之一切换到一个键时我仍然得到错误。

4

6 回答 6

9

基于 SingleShot 链接到的代码,并随机戳直到它工作,这就是我如何“工作”这个问题,(我用引号说,因为它感觉非常脆弱。)

以下是使其正常工作的方法:

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

需要注意的一些重要事项:您不能将 maven 依赖项用作设置 ant 属性的 refid。您必须使用 ${} 来获取 maven var 值。

看来依赖项必须在顶级依赖项列表中,使 log4j 成为 antrun 插件的依赖项不会以我能看到的任何方式将其暴露给插件。

所有路径分隔符都是点 (.),没有冒号 (:),这就是我最终检查自己的答案是否正确的原因。

肥皂盒:

我强烈建议任何考虑使用 Maven 的人将 Ant 与 maven 插件一起使用,或者更好的是,将 Ant 与 Ivy 一起使用。

这个特殊的问题是与使用 maven 做任何不规范的事情相关的完全荒谬的难度水平的一个光辉例子。

我说这已经实现了一个基于 Maven2 的完整构建系统,并且还在 Ant 中实现了几个构建系统。我已经将 Maven2 和 Ant 用于涉及 Java、Flex/AS3、C# 和 C++ 的复杂构建。Maven 对于对其他语言的项目没有外部依赖的Java项目是有意义的。

Maven 确实解决了 Ant 未隐式解决的一些问题,但通过一些预先规划,Ant 是更灵活、文档更好、错误更少的工具。

如果您决定走 ant 路线,请确保为您的项目定义一个结构,找出您的依赖系统(使用一个)。

我认为你最终会比使用 Maven 更快乐,因为你不会花时间去修复你的构建系统。

于 2009-10-19T17:45:51.930 回答
4

作为上述 Aaron H. 答案的附录,我必须将插件的版本设置为 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>您正在使用的 Maven POM 依赖项的标签,我可以尝试更具体。

我查看了插件的代码以确认。

于 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 上设置类路径的 shell 脚本。我没有比较它设置的类路径和 maven 可用的类路径,但我的测试表明它们不匹配,并且 ant 不会运行从 maven 传递给它的一些路径。

我使用的是“exec-maven-plugin”并将 ant 作为外部程序运行,并应用了一些参数。这肯定会起作用,但会增加额外的依赖项。

于 2012-08-15T07:22:56.230 回答