运行 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 库。

  1. 首先,为该库创建一个路径。假设您的库位于 lib 目录中。

    <path id="library.gson-2.8.0.classpath"> <pathelement location="${basedir}/lib/gson-2.8.0.jar"/> </path>

    对其他依赖项也执行相同的操作。

  2. 接下来,创建一个包含所有这些依赖项的路径,这样您就可以将所有依赖项作为一个变量来引用。这将是您的 AntTargets.classpath

    <path id="AntTargets.classpath"> <path refid="library.gson-2.8.0.classpath"/> ...... <!-- Add paths for your other dependencies by refid here--> </path>

  3. 现在,当您使用 AntTargets.classpath Ant 时,它会知道那是什么并将它用于 运行 您的 jar。

我注意到你在 run 目标中使用了它,所以如果你想从你自己的 jar 中 运行 客户端 class,请将其包含在你的 class路径也是如此。

另请记住,"Client" 的信息可能不够——您必须提供 class 的完全限定名称,包括软件包名称,例如像 "com.package.Client".

编辑:

我刚注意到您从 运行ning 直接使用 Ant 获得的异常。您需要在我们创建的这个路径变量中包含 javax.mail 库。这应该可以解决该问题。

编辑 2:

我好像理解错了。我以为你的 ant 任务是试图调用你的 Java 程序来发送邮件,但它不能,因为它不知道 javax.mail.jar 在哪里,所以我指示你将其添加到 class 路径。

但是你想要做的是:

  1. 使用 Ant 邮件任务发送邮件。
  2. 并且在 Java 中你想要读取构建文件并执行发送邮件的目标。

这里有一些相关信息:mail 是一个 Ant 任务,如果您想使用某些参数,它需要 javax.mail 库。查看 this and this 等几个问题,我发现您应该放置 ${ANT_HOME}/lib,即您的 ant.jar 所在的位置,以便 Ant 的 classloader 可以选择它并使用它。在那种情况下,如果我对你想要什么的假设是正确的,那么你应该能够摆脱 AntTargets.classpath,因为实际上,你的构建文件不需要知道你如何调用它的任何目标。