我有一个build.xml
在命令行上可以正常工作的Ant
文件:它可以编译,构建JAR,并且可以从JAR执行main方法。该build.xml
文件引用了分散在各处的几个第三方库。在构建JAR时,脚本不会将所有第三方库都包含在JAR本身中。相反,它将它们的路径放入JAR的清单中。这有助于使我的JAR保持整洁。
我希望能够在Eclipse中编辑和调试我的项目,但是我找不到一种简便的方法。我可以让我的项目使用Ant文件来构建项目,这似乎可行。但是,Eclipse在查找第三方库时遇到了麻烦,因此Eclipse有两个问题:
我可以通过在两个不同的地方(即通过的构建路径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
),该脚本生成.classpath
Eclipse使用的文件。
#!/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