【问题标题】:Maven Antrun and DependenciesMaven Antrun 和依赖项
【发布时间】:2010-12-07 12:34:34
【问题描述】:

(请参阅下面的编辑。)

之所以不能只使用classpath,是因为我需要管理一些非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”和 grep 用于“Storing”,这会在存储内容的地方显示一堆日志输出。

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

【问题讨论】:

    标签: ant dependencies maven-2 maven-antrun-plugin


    【解决方案1】:

    这对我有用。

    <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 类路径中引用依赖项。

    【讨论】:

      【解决方案2】:

      我有一只现有的蚂蚁,我们计划使用(新的)maven 来调用它。我遇到的问题我可能记不太清楚,但它与类路径有关,可能和你的一样。

      问题是,我们每天使用的“ant”是一个设置类路径的 shell 脚本,在 XNIX 和 Windows 上都是如此。我没有比较它设置的类路径和 maven 可用的类路径,但我的测试表明它们不匹配,并且 ant 不会运行一些从 maven 传递给它的路径。

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

      【讨论】:

        【解决方案3】:

        根据 SingleShot 链接到的代码和随机戳直到它起作用,这就是我如何“解决”这个问题,(我用引号表示,因为它感觉非常脆弱。)

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

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

        需要注意的一些重要事项:不能在设置 ant 属性时使用 maven 依赖项作为 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 更快乐,因为你不会花费关键时间来修复你的构建系统。

        【讨论】:

          【解决方案4】:

          有一个bug in the documentation。路径应采用以下形式:

          <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}"/> 
          

          【讨论】:

            【解决方案5】:

            作为 Aaron H. 上述答案的补充,我必须将插件的版本设置为 1.3 才能真正起作用。我在没有特定版本的情况下使用它并且得到了 1.1(似乎没有任何工作)。

            
                  <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <version>1.3</version>
                    ...
                  </plugin>
            

            【讨论】:

            • 我怀疑区别在于我们使用的存储库。这就是,恕我直言(或者可能不那么谦虚),这只是“它只是工作”与 maven 一起崩溃的另一个例子......
            【解决方案6】:

            如果没有您在 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,而是引用适当范围的整个类路径,正如插件文档有些稀疏所示。

            如果您仍然有问题,请为您正在使用的 Maven POM 依赖项发布 &lt;dependency&gt; 标签,我可以尝试更具体。

            我查看了plugin's code 进行确认。

            【讨论】:

            • 对不起。我最初的答案错过了“maven.dependency”。前缀和“.path”后缀。它现在已修复并且应该可以工作。查看插件源代码(上面链接)的第 87 行,看看它应该是什么样子。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-04-10
            • 2011-04-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多