【问题标题】:ant, jar files, and Class-Path oh myant、jar 文件和 Class-Path 哦,我的
【发布时间】:2010-11-14 12:11:42
【问题描述】:

我正在尝试重新构建我的构建技术,以创建依赖于常见 3rd 方 jar 文件的 Java jar 文件。 (GlazedLists、Apache Commons 等)

我一直将它们全部放入 {Java JRE dir}/lib/ext 以便 JRE 自动看到它们,但这导致了一些问题,例如不记得我需要分发某些 jar 文件,所以我会喜欢学习更明确。

所以我将它们全部移入 c:\appl\java\common\,将它们添加到 Eclipse 构建路径,并在我的 ant 文件中定义:

<path id="javac_classpath">
    <fileset dir="${libDir}">
        <include name="*.jar"/>
    </fileset>
    <fileset dir="c:/appl/java/common">
        <include name="*.jar"/>
    </fileset>
</path>

我的 Class-Path 清单标头设置为“。”在我的jar 任务中,但即使我将相关的 jar 文件放入与我的应用程序 jar 文件相同的目录中,这似乎也不起作用。我可以将它们一个一个地手动添加到 Class-Path 标头中,但我想知道,有没有更简单的方法来正确设置 Class-Path 标头?

【问题讨论】:

    标签: java ant jar


    【解决方案1】:

    这就是你所需要的:

    <path id="build-classpath">
        <fileset dir="${dist}/lib">
            <include name="*.jar"/>
        </fileset>
    </path>
    <manifestclasspath property="lib.list" jarfile="${dist}/lib/myprog.jar">
        <classpath refid="build-classpath"/>
    </manifestclasspath>
    <jar jarfile="${dist}/lib/myprog.jar"
         basedir="${build}"
         includes="com/my/prog/**" >
        <manifest>
            <attribute name="Main-Class" value="com.my.prog.MyProg"/>
            <attribute name="Class-Path" value="${lib.list}"/>
        </manifest>
    </jar>
    

    如您所见,它假定您已编译 Java 类并将它们输出到 ${build}。它还假设您已将 jarfile 复制到 ${dist}/lib

    也就是说,值得研究其他内置支持依赖项的构建系统,例如 Maven 和 Gradle。这些其他构建系统已经考虑了许多常见的项目结构和构建操作,因此您不必将所有内容都编写到最后的细节。

    【讨论】:

    • 啊啊啊……这就是我要找的。太棒了!
    • 嗯。更正:它不适用于新版本,因为 ${dist}/lib 目录可能还不存在。有没有办法延迟 任务的执行?
    • 卫生署!没关系,我已经将 放在了我的 ant 文件的根部分,只是通过将其放入 jar 任务来修复它。再次感谢!!!!!!
    • 没问题;很高兴我能帮上忙!
    • 我刚刚找到你的答案,想谢谢你。真的帮了我很大的忙!
    【解决方案2】:

    你想要的是mapper。 Flattenmapper 可能是最简单的,但本质上您需要创建一个指定类路径的路径元素,然后在其上使用 pathconvert 将其转换为可以包含在清单中的字符串。

    编辑:您可以使用包含规则来构建路径元素,因此以 jar 结尾的目录中的所有内容都是**/*.jar

    【讨论】:

      【解决方案3】:

      对于 ant 1.7 及更高版本,manifestclasspath 任务是前进的方向。 如果您使用的是 1.7 之前的 ant 版本,则 manifestclasspath 任务不存在。

      以下给出相同的结果:-

      <path id="build.classpath">
          <fileset dir="${dist}/lib">
              <include name="*.jar" />
              <exclude name="myprog.jar" />
          </fileset>
      </path>
      
      <pathconvert property="lib.list" pathsep=" ">
          <path refid="build.classpath" />
          <mapper>
              <chainedmapper>
                  <flattenmapper />
              </chainedmapper>
          </mapper>
      </pathconvert>
      
      <target name="generate.jar">
          <jar destfile="${dist}/lib/myprog.jar">
              <manifest>
                  <attribute name="Main-Class"
                      value="com.mypackage.MyClass" />
                  <attribute name="Class-Path" value="${manifest.classpath}" />
              </manifest>
          </jar>
      </target>
      

      【讨论】:

      • 在generate.jar中,manifest.classpath的引用不应该是lib.list吗?
      【解决方案4】:

      出于安全原因,默认情况下,类路径目录不包含 Jar 文件。有人可以在其中放置一个 jar 文件,并且可以在您不知情的情况下加载它,覆盖您的代码。我确实知道有关于添加另一个标志或结束标记以允许将 Jar 文件添加到类路径中的讨论,但是,如果我没记错的话,那是为版本 7 准备的。但是,我在最后一部分可能是错误的。

      【讨论】:

        【解决方案5】:

        jar 文件的 Class-Path 清单标头要求您明确列出要包含的 jar 文件。 在类路径中列出目录意味着 java 将在该目录中查找 .class 文件,而不是 jarfile。

        【讨论】:

          【解决方案6】:

          由于您在 Ant 中,您可能不想切换,但 Maven 非常擅长识别您的所有依赖项,并且有多种工具可以将您的 lib jar 复制或组合在一起以进行分发。出于我的目的,我有一个 Maven 插件,它在构建期间创建一个运行脚本,它反过来为我设置类路径,所以我不需要担心它。

          【讨论】:

          • Ivy 是一种非常兼容 ant 的依赖管理方式。
          猜你喜欢
          • 2012-12-13
          • 2018-04-01
          • 2012-11-12
          • 1970-01-01
          • 2020-01-30
          • 2018-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多