在 Web 应用程序和批处理应用程序之间共享代码库的好方法是什么?

What is a good approach to share a code base between a webapp and batch applications?

我正在开发一个相当大范围的 Java 网络应用程序。 它有许多模块,使用许多外部库来做事,并与一组独立的批处理应用程序(cron 作业)紧密合作,这些应用程序生成 PDF、发票、批处理日志文件,定期 FTP 上传给合作伙伴基础和所有类似的东西。

我的代码库分为

第一层包含两个包.web.batch。第一个包含所有与 servlet 相关的内容,后者包含所有具有 main(String[] args) 方法的批处理程序。这两个世界都使用公共层和业务层来完成他们的工作,通常甚至是相同的方法(例如 loadUser()storeUser() 等)

现在我有一个宽泛的问题:

什么是合适的部署策略?

考虑到我想将我的 webapp 部署为 .war 存档,并且批处理程序应该可以从 UNIX cron.

调用

还有一个非常具体的:

如何从业务层加载资源?

在考虑 webapp 时,我会在 WEB-INF 目录中存储配置文件,例如 Apache FOP 配置文件和 .xsl 用于生成发票 PDF 等的转换文件,可能有些子目录,还是在 .war 文件 META-INF 中?

但是在业务层,需要这些东西的地方,(比如服务方法generateInvoicePDF(transaction)),我不能用servletContext去抢资源。在批处理程序中,甚至没有 servletContext 和 WEB-INF 目录!

你们是怎么做到的? web层真的只需要resources吗?还是将所有这些文件放入类路径根目录并使用 ClassLoader.getResource()?我最终会在那里得到一些各种各样的文件。不喜欢那样。或者仅将类路径根目录中的配置文件和 .xsl 放入文件系统中的某个外部硬编码文件夹中(不是很便携)?

来自其他项目的任何指导和经验将不胜感激。

如果你有业务层需要的资源,把它们放在业务层jar中。

不要访问您的 Web 层(通过 ServletContext)来检索内层中的内容。

参见:How to package resources, that are accessed directly , into a jar file