我是一个非常新的蚂蚁,我试图在一个由Java调用的ant-target中发送一封电子邮件。我正在使用Netbeans IDE。
蚂蚁:
<project name="AntTargets" default="main" basedir=".">
<description>Builds, tests, and runs the project AntTargets.</description>
<import file="nbproject/build-impl.xml"/>
<target name="run" depends="jar">
<java classpathref="AntTargets.classpath" fork="true" classname="Client" />
</target>
<target name="main">
<echo message="******************[MAIN]******************"/>
<property file="nbproject/build.properties"/>
<property name="to" value="${builder}" />
<property name="from" value="${builder}" />
<property name="server" value="${server}" />
<property name="port" value="${port}" />
<mail mailhost="${server}" mailport="${port}" subject="Test build">
<from address="${from}"/>
<replyto address="${to}"/>
<to address="test@domain.de"/>
<message>The build has been completed</message>
</mail>
<echo message="Email to ${to} from ${from} has been sent using the server ${server} on port ${port}."/>
</target>
</project>
爪哇:
import java.io.File;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.ProjectHelper;
public class AntTargets {
public static void main(String[] args) {
//get new file
File buildFile = new File("build.xml");
//create new project
Project p = new Project();
p.setUserProperty("ant.file", buildFile.getAbsolutePath());
p.init();
//initialize helper
ProjectHelper helper = ProjectHelper.getProjectHelper();
p.addReference("ant.projectHelper", helper);
//parse and execute
helper.parse(p, buildFile);
p.executeTarget(p.getDefaultTarget());
}
}
当我直接执行ant部分时,找到属性文件,读取并整体工作,但邮件部分给我这个错误:
Failed to send email: javax.mail.internet.MimeMessage
build.xml:16:
java.lang.ClassNotFoundException: javax.mail.internet.MimeMessage
当我用java调用它时,我得到:
Reference AntTargets.classpath not found.
BUILD FAILED (total time: 0 seconds)
我非常感谢任何帮助和提示。
答案 0 :(得分:1)
问题是Ant不知道AntTargets.classpath
是什么。
您必须定义一个类路径变量并为其指定id="AntTargets.classpath
。在此路径变量中,您应该定义所使用的库的物理位置。 (您应该考虑创建路径变量以减少代码中的冗余,特别是当您想在不同的ant目标中使用相同的路径时。)
以下是一个示例:假设您的项目在运行时需要Gson库。
首先,为该库创建一个路径。我们假设你的库在lib目录中。
<path id="library.gson-2.8.0.classpath">
<pathelement location="${basedir}/lib/gson-2.8.0.jar"/>
</path>
对其他依赖项也这样做。
接下来,创建一个包含所有这些依赖项的路径,这样您就可以将所有依赖项称为一个变量。这将是你的AntTargets.classpath
<path id="AntTargets.classpath">
<path refid="library.gson-2.8.0.classpath"/>
...... <!-- Add paths for your other dependencies by refid here-->
</path>
现在,当你使用AntTargets.classpath
时,Ant会知道它是什么,并用它来运行你的jar。
我注意到你在run
目标中使用它,所以如果你试图从你自己的jar中运行Client类,那么也要在你的类路径中包含它。
另请注意,“客户”可能不是足够的信息 - 您必须提供类的完全限定名称,包括包名称,例如像“com.package.Client”这样的东西。
编辑:
我刚注意到你直接使用Ant运行时遇到的异常。您需要在我们创建的路径变量中包含javax.mail库。这应该解决这个问题。
编辑2:
我好像被误解了。我认为你的ant任务试图调用你的Java程序来发送邮件,但它不能,因为它不知道javax.mail.jar在哪里,所以我指示你把它添加到类路径。
但是你想要做的是: