运行 ant-target 通过 java 发送邮件
Running ant-target to send a mail via java
我是 ant 的新手,我正在尝试在 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>
Java:
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)
我将不胜感激任何帮助和提示。
问题是 Ant 不知道 AntTargets.classpath
是什么。
你必须定义一个class路径变量并给它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 中 运行 客户端 class,请将其包含在你的 class路径也是如此。
另请记住,"Client" 的信息可能不够——您必须提供 class 的完全限定名称,包括软件包名称,例如像 "com.package.Client".
编辑:
我刚注意到您从 运行ning 直接使用 Ant 获得的异常。您需要在我们创建的这个路径变量中包含 javax.mail 库。这应该可以解决该问题。
编辑 2:
我好像理解错了。我以为你的 ant 任务是试图调用你的 Java 程序来发送邮件,但它不能,因为它不知道 javax.mail.jar 在哪里,所以我指示你将其添加到 class 路径。
但是你想要做的是:
- 使用 Ant 邮件任务发送邮件。
- 并且在 Java 中你想要读取构建文件并执行发送邮件的目标。
这里有一些相关信息:mail
是一个 Ant 任务,如果您想使用某些参数,它需要 javax.mail
库。查看 this and this 等几个问题,我发现您应该放置 ${ANT_HOME}/lib,即您的 ant.jar 所在的位置,以便 Ant 的 classloader 可以选择它并使用它。在那种情况下,如果我对你想要什么的假设是正确的,那么你应该能够摆脱 AntTargets.classpath
,因为实际上,你的构建文件不需要知道你如何调用它的任何目标。
我是 ant 的新手,我正在尝试在 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>
Java:
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)
我将不胜感激任何帮助和提示。
问题是 Ant 不知道 AntTargets.classpath
是什么。
你必须定义一个class路径变量并给它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 中 运行 客户端 class,请将其包含在你的 class路径也是如此。
另请记住,"Client" 的信息可能不够——您必须提供 class 的完全限定名称,包括软件包名称,例如像 "com.package.Client".
编辑:
我刚注意到您从 运行ning 直接使用 Ant 获得的异常。您需要在我们创建的这个路径变量中包含 javax.mail 库。这应该可以解决该问题。
编辑 2:
我好像理解错了。我以为你的 ant 任务是试图调用你的 Java 程序来发送邮件,但它不能,因为它不知道 javax.mail.jar 在哪里,所以我指示你将其添加到 class 路径。
但是你想要做的是:
- 使用 Ant 邮件任务发送邮件。
- 并且在 Java 中你想要读取构建文件并执行发送邮件的目标。
这里有一些相关信息:mail
是一个 Ant 任务,如果您想使用某些参数,它需要 javax.mail
库。查看 this and this 等几个问题,我发现您应该放置 ${ANT_HOME}/lib,即您的 ant.jar 所在的位置,以便 Ant 的 classloader 可以选择它并使用它。在那种情况下,如果我对你想要什么的假设是正确的,那么你应该能够摆脱 AntTargets.classpath
,因为实际上,你的构建文件不需要知道你如何调用它的任何目标。