运行ant-target通过java发送邮件

时间:2017-06-15 14:13:43

标签: java email netbeans ant mime-message

我是一个非常新的蚂蚁,我试图在一个由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)

我非常感谢任何帮助和提示。

1 个答案:

答案 0 :(得分:1)

问题是Ant不知道AntTargets.classpath是什么。

您必须定义一个类路径变量并为其指定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。

  4. 我注意到你在run目标中使用它,所以如果你试图从你自己的jar中运行Client类,那么也要在你的类路径中包含它。

    另请注意,“客户”可能不是足够的信息 - 您必须提供类的完全限定名称,包括包名称,例如像“com.package.Client”这样的东西。

    编辑:

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

    编辑2:

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

    但是你想要做的是:

    1. 使用Ant邮件任务发送邮件。
    2. 在Java中,您想要读取构建文件并执行发送邮件的目标。
    3. 以下是一些信息:mail是一个需要javax.mail库的Ant任务,如果你想使用某些参数。看看像thisthis这样的几个问题,我看到你应该把$ {ANT_HOME} / lib,即你的ant.jar放在哪里,这样Ant的类加载器可以把它拿起并使用它。在这种情况下,如果我对你想要的东西的假设是正确的,那么你应该能够摆脱AntTargets.classpath,因为实际上,你的构建文件不需要知道如何调用它的任何目标。 / p>