当前位置: 首页 > 面试题库 >

在Eclipse中使用Ant的类路径

薛泰
2023-03-14
问题内容

我有一个build.xml在命令行上可以正常工作的Ant
文件:它可以编译,构建JAR,并且可以从JAR执行main方法。该build.xml文件引用了分散在各处的几个第三方库。在构建JAR时,脚本不会将所有第三方库都包含在JAR本身中。相反,它将它们的路径放入JAR的清单中。这有助于使我的JAR保持整洁。

我希望能够在Eclipse中编辑和调试我的项目,但是我找不到一种简便的方法。我可以让我的项目使用Ant文件来构建项目,这似乎可行。但是,Eclipse在查找第三方库时遇到了麻烦,因此Eclipse有两个问题:

  1. 它显示(在文本编辑器中)许多编译错误,因为许多类未定义,并且
  2. 它无法执行JAR。

我可以通过在两个不同的地方(即通过的构建路径Properties->Java Build Path->Libraries和通过的执行类路径Run Configurations->Classpath)手动指定所有第三方库来解决上述两个问题。但似乎我不必手动执行此操作,因为所有第三方库都已列在我的JAR清单中。我究竟做错了什么?

这是我的build.xml档案:

<!-- Set global properties for this build -->
<property name="src"         location="./src" />
<property name="build"       location="./build"/>
<property name="dist"        location="./dist"/>
<property name="logs"        location="./logs"/>
<property name="docs"        location="./docs"/>
<property name="jar"         location="${dist}/dynamic_analyzer.jar"/>
<property name="lib"         location="../../thirdparty/lib"/>
<property name="hive-util"   location="../../hive-utils/dist"/>
<property name="hpdb"        location="../../hive-db/hpdb/dist"/>
<property name="static"      location="../../hive-backend/static_analyzer/dist"/>
<property name="mainclass"   value="com.datawarellc.main.DynamicMain"/>

<path id="dep.runtime">
    <fileset dir="${lib}"       includes="**/*.jar"/>
    <fileset dir="${hive-util}" includes="**/*.jar"/>
    <fileset dir="${hpdb}"      includes="**/*.jar"/>
    <fileset dir="${static}"    includes="**/*.jar"/>
</path>

<target name="clean">
    <delete dir="${build}"/>
    <delete dir="${dist}"/>
    <delete dir="${docs}"/>
    <delete dir="${logs}"/>
</target>

<target name="init">
    <tstamp/>
    <mkdir dir="${build}"/>
    <mkdir dir="${dist}"/>
    <mkdir dir="${logs}"/>
</target>

<target name="compile" depends="init">
    <javac srcdir="${src}" destdir="${build}" debug="on" includeantruntime="false">
        <classpath refid="dep.runtime" />
    </javac>

    <!-- Debug output of classpath -->
    <property name="myclasspath" refid="dep.runtime"/>
    <echo message="Classpath = ${myclasspath}"/>

</target>

<target name="jar" depends="compile">
    <!-- Put the classpath in the manifest -->
    <manifestclasspath property="manifest_cp" jarfile="${jar}" maxParentLevels="10">
        <classpath refid="dep.runtime" />
    </manifestclasspath>

    <jar jarfile="${jar}" basedir="${build}">
        <manifest>
            <attribute name="Main-Class" value="${mainclass}"/>
            <attribute name="Class-Path" value="${manifest_cp}"/>
        </manifest>
        <zipfileset dir="${src}" includes="**/*.xml" />
    </jar>
</target>

你可以看到,我有几个目录中的第三方库(${lib}${hive- util}${hpdb}${static})。我用这些来创建一个path称为dep.runtime。然后dep.runtime,在构建罐子时将其包括在清单中。
如何dep.runtime在执行时让Eclipse将其用于构建路径和类路径?


问题答案:

受@ leeand00提供的链接启发,我提出了以下解决方法。

首先,我编写了一个简单的Perl脚本(称为genClasspath.pl),该脚本生成.classpathEclipse使用的文件。

#!/usr/bin/perl
use strict;

if (@ARGV != 2) {
  print STDERR "Usage: $0 OUTFILE CLASSPATHSTRING\n";
  print STDERR "e.g., $0 .classpath path1:path2:path3\n";
  exit 1;
}

my $OUTFILE         = $ARGV[0];
my $CLASSPATHSTRING = $ARGV[1];

open my $out_fh, '>', $OUTFILE or die "Couldn't open output file: $!";

print $out_fh q{<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    <classpathentry kind="output" path="build"/>
};

my @libs = split(":", $CLASSPATHSTRING);
foreach my $thisLib (@libs){
    print $out_fh "    <classpathentry kind=\"lib\" path=\"$thisLib\"/>\n";
}
print $out_fh "</classpath>\n";

然后,我将build.xml文件的内容调用此脚本dep.runtime

<target name="compile" depends="init">
    <javac srcdir="${src}" destdir="${build}" debug="on" includeantruntime="false">
        <classpath refid="dep.runtime" />
    </javac>

    <property name="myclasspath" refid="dep.runtime"/>

    <exec dir="." executable="../../scripts/genClasspath.pl" os="Linux">
        <arg value=".classpath"/>
        <arg value="${myclasspath}"/>
    </exec>

</target>

唯一的问题是,在Eclipse中打开项目之前,我至少需要在命令行上运行一次Ant。但是,当我这样做时,Eclipse可以很好地编译和执行我的项目,因为类路径与Ant的完全相同。



 类似资料:
  • 我有一个带有Ant构建脚本的项目,该脚本基于单独的动态Web项目中的类文件创建JAR文件。我已经读到,我可以在构建脚本中使用${workspace\u loc},但当我用${workspace\u loc}替换动态Web项目的硬编码路径时,构建失败: 生成失败D:\Eclipse\projects\webapp\workspace\Ant BUILD for client\BUILD。xml:30

  • 我的项目是用Maven构建的。我很高兴和Maven一起建造。现在,我需要用Ant构建它(我希望我不需要!!!)。我希望使用现有的maven依赖项——也就是说,希望保留pom进行依赖项管理。 所以,我写了这个任务: 但是,ant编译输出抱怨mypomdeps指向的库(在jars中)丢失了。 javac无法看到我想要的类路径的原因是什么? 我是否正确使用了由工件:依赖项生成的filesetId? 我的

  • 有人举过一个使用JDK 6风格的例子吗?只定义目录,而不是目录中每个jar的列表。类路径有ANT javac编译任务吗? 我们这样试过了 编写classpath=c:。。。。\WEB-INF\lib*;。。。websphere。。。\a、 罐子;。。。websphere。。。\b、 罐子;等,并在javac任务中使用了这个类路径,但WEB-INF\lib中的库没有被识别。 所以,我想知道是否有可能

  • 在Eclipse 4.2中,是否有方法显示Ant视图中包含的Ant构建文件的路径或项目名称信息? 在我的工作区中,我当前签出了两个版本的项目,一个来自我们的myproject/trunk,另一个来自myproject/Branchs/feature 从每个分支中,我已经将适当的build.xml从项目中拖到蚂蚁视图中。但是,由于主干和功能分支都有相同的项目名称和相同的目标,因此在蚂蚁视图中无法区分

  • 问题内容: 我试图在一些使用ant脚本的旧项目上进行“干净的专家”设置。我对蚂蚁知之甚少,所以我的问题似乎很幼稚。 我快完成了,但是由于classpath中的冗余,所以传递ant脚本失败了。如果我了解构建,则这些行应将“提供”范围内的每个库添加到类路径中: 然后这个: 将那些依赖项添加到ant.home目录中的库中。 麻烦的是,我使用的maven pom依赖于我无法修改的父pom,因此,我的类路径

  • 我正在尝试构建我的控制台应用程序,并且我正在使用Ant来构建它。我可以在Eclipse中运行我的应用程序,但是当我试图从我得到的jar中运行它时,ClassNotFoundException:被抛出。是在我的应用程序中使用的一个罐子中。这里是build.xml的一部分,我在这里创建manifest: UPD:我应该把有库的罐子放进我的罐子里吗?现在我把它们放到JAR的“lib”目录中。所以myja