gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:52:31 31 4
gpt4 key购买 nike

我是 ant 的新手,我正在尝试在 Java 调用的 ant-target 内发送电子邮件。我正在使用 Netbeans IDE。

Ant :

<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是。

您必须定义一个类路径变量并给它 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 运行 Client 类,请将其也包含在您的类路径中。

另请记住,“Client”可能不足以提供足够的信息 - 您必须提供类的完全限定名称,包括包名称,例如类似“com.package.Client”。

编辑:

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

编辑2:

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

但是您想要做的是:

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

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

关于java - 运行 ant-target 通过 java 发送邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44569838/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com