我在eclipse中创建了一个简单的'AntExecutor'应用程序,它可以以编程方式运行ant任务并且可以正常工作。但是出于大学目的,我需要将它与IDE保持独立。所以,有趣的是,我正在努力创建可以编译,构建我的'AntExecutor'应用程序(执行ant任务)的ant任务:)
精简版我正在尝试定义ant-tasks,只包含'storageAccess'包中的一个源文件:
./src/storageAccess/AntExecutor.java
我有一些AntExecutor.java在以下地方使用的库:
./lib
构建文件位于:
./build.xml
AntExecutor.java还需要ant库来执行ant任务,以便在编译时将它们添加到CP中。在构建文件中:
<classpath path="${build};D:/DevTools/apache-ant-1.9.8/lib/;"/>
完整的build.xml文件:
<project name="AntExecutor" default="dist" basedir=".">
<description>
simple example build file
</description>
<!-- set global properties for this build -->
<property name="src" location="src"/>
<property name="build" location="build/classes/"/>
<property name="dist" location="build/jar/"/>
<target name="init">
<!-- Create the time stamp -->
<tstamp/>
<!-- Create the build directory structure used by compile -->
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init"
description="compile the source " >
<!-- Compile the java code from ${src} into ${build} -->
<javac destdir="${build}">
<src path="${src}"/>
<classpath path="${build};D:/DevTools/apache-ant-1.9.8/lib/;"/>
</javac>
</target>
<target name="dist" depends="compile"
description="generate the distribution" >
<!-- Create the distribution directory -->
<mkdir dir="${dist}"/>
<!-- Put everything in ${build} into RunExecutor.jar file -->
<jar destfile = "${dist}/RunExecutor.jar" basedir="${build}">
<manifest>
<attribute name = "Main-Class" value = "storageAccess.AntExecutor"/>
<attribute name = "Class-Path" value = "D:/DevTools/apache-ant-1.9.8/lib/;"/>
</manifest>
</jar>
<copy todir="${dist}\lib">
<fileset dir="lib"/>
</copy>
</target>
<target name="clean"
description="clean up" >
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build}"/>
<delete dir="${dist}"/>
</target>
</project>
现在如果我运行'ant dist'命令我没有错误,构建成功并在./build/jar
创建RunExecutor.jar文件
要检查RunExecutor.jar的内容,我运行了:jar tf build/jar/RunExecutor.jar
结果:
META-INF/
META-INF/MANIFEST.MF
storageAccess/
storageAccess/AntExecutor.class
所以似乎storageAcces.AntExecutor类确实成功编译为.jar文件。
但是,如果我尝试像这样运行它:java -jar build/jar/RunExecutor.jar
我收到此错误:
Error: Could not find or load main class storageAccess.AntExecutor
主要-问题:
为什么它找不到明显的类。(如'jar tf'所示)我该如何解决这个问题?
,将CP / ant / lib。*文件添加到CP进行编译和运行'RunExecutor.jar'的正确方法是什么? 是否可以像我现在一样指定它们的路径? :
<attribute name = "Class-Path" value = "D:/DevTools/apache-ant-1.9.8/lib/;"/>
或者,也许我应该使用通配符,如:
<attribute name = "Class-Path" value = "D:/DevTools/apache-ant-1.9.8/lib/*.jar;"/>
或者,我应该一个接一个地沮丧地添加所有文件吗?
<attribute name = "Class-Path" value = "D:/DevTools/apache-ant-1.9.8/lib/ant.jar;"/> , etc...
答案 0 :(得分:0)
的问题
<attribute name = "Class-Path" value = "D:/DevTools/apache-ant-1.9.8/lib/;"/>
你是硬编码路径,这不是一个好习惯。这个jar不会在其他机器上执行,因为他们很可能在相同位置没有lib。
您可以直接从eclipse项目本身创建可执行jar。有关步骤,请参阅this。
您也可以将必需的lib放在同一个jar文件中,默认情况下它们会被添加到class-path。