Apache James Mail Server:在哪里放置自定义Mailets?

时间:2017-09-11 13:08:28

标签: java apache email james

我想为Apache James Mail Server安装一个自定义Mailet。

我通过linagora/james-project图片通过Docker运行James。设置工作(当然只在本地,但目前已足够),因为我可以设置帐户并通过IMAP与Thunderbird连接,我可以在这些帐户之间发送邮件。

现在我想将自定义Mailet部署到此设置。我使用本教程尝试过:https://james.apache.org/server/3/dev-extend-mailet.html (我不得不创建文件夹/ conf / lib /,因为它不存在)但它不起作用。在日志中我看到像这样的错误:

james | [main] INFO org.apache.james.mailetcontainer.lib.AbstractStateMailetProcessor - Matcher All instantiated.
james | [main] ERROR org.apache.james.mailetcontainer.lib.AbstractStateMailetProcessor - Unable to init mailet com.jeremiaslubberger.mailets.TestMailet: javax.mail.MessagingException: Can not load mailet com.jeremiaslubberger.mailets.TestMailet;
james |   nested exception is:
james |     java.lang.ClassNotFoundException: com.jeremiaslubberger.mailets.TestMailet
james | javax.mail.MessagingException: Can not load mailet com.jeremiaslubberger.mailets.TestMailet;
james |   nested exception is:
james |     java.lang.ClassNotFoundException: com.jeremiaslubberger.mailets.TestMailet

通过搜索源代码,我找到了文件ExtendedClassLoader.java,其中有一行 public static final String EXTENSIONS_JARS_FOLDER_NAME = "extensions-jars/"; 所以我尝试创建这个文件夹(在James根文件夹中)并将包含自定义Mailet的JAR放在那里。

这仍会产生错误但不起作用,但Log现在看起来像这样:

james | [main] INFO org.apache.james.mailetcontainer.lib.AbstractStateMailetProcessor - Matcher All instantiated.
james | Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/mailet/GenericMailet
james |     at java.lang.ClassLoader.defineClass1(Native Method)
james |     at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
james |     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
james |     at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
james |     at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
james |     at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
james |     at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
james |     at java.security.AccessController.doPrivileged(Native Method)
james |     at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
james |     at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
james |     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
james |     at org.apache.james.utils.ExtendedClassLoader.locateClass(ExtendedClassLoader.java:80)
james |     at org.apache.james.utils.GuiceGenericLoader.instanciate(GuiceGenericLoader.java:37)
james |     at org.apache.james.utils.GuiceMailetLoader.getMailet(GuiceMailetLoader.java:45)

我的自定义Mailet确实扩展了GenericMailet,但所有其他(默认)Mailet也是如此。此外,我导出了我的mailet包括所有资源,因此应该没有任何遗漏。现在我没有想法了。

有人可以帮忙吗?我需要在哪里放置包含我的自定义Mailet的JAR?

2 个答案:

答案 0 :(得分:0)

它是Apache James文件夹中的conf / lib文件夹。此文件夹以每个版本提供的默认ZIP(例如3.0.1)提供。

此外,您需要在类路径中使用mailet-base和mailet-api jar(包装Generic mailet)。通常就是这种情况。

extension-jars文件夹特定于Guice布线(您似乎没有使用,因为您依赖于Spring布线)

不要犹豫,https://gitter.im/apache/james-project与我们联系,我们会更加反应......

答案 1 :(得分:0)

您应该从 pwd = /james-root/bin/ 运行 James。否则,您将在应用程序启动时收到 ClassNotFoundException。这是因为 run.sh 中的相对类路径定义。 我花了很多时间才弄明白))