如何使用其他项目扩展/自定义WAR

我们的项目有以下场景:

  • 打包为war文件的核心Web应用程序(称为Core项目)。
  • 需要为每个客户“定制”或“扩展”核心应用程序(称之为客户项目)。 这主要包括新的bean定义(我们使用Spring),即。 用特定于客户的实现替换core.war中的服务实现。
  • 我们希望独立开发核心和客户项目
  • 开发Customer项目时,我们需要能够在Eclipse(在Tomcat上)上运行/调试它,并将Core项目作为依赖项
  • 构建Customer项目时,生成的war文件“包括”核心和客户项目。 所以.war是应用程序的客户特定版本

我正在寻找关于在工具和项目配置方面做到这一点的最佳方法的建议。

我们目前正在使用Ant,但是希望避免被ant埋没。 有没有人用Maven做过这件事?

我已经看过很多关于如何构建依赖于Java应用程序的Web应用程序的post,但是根据其他Web应用程序,Web应用程序上没有任何内容。

谢谢!

在Eclipse中,有一种“原生”WTP方法可以做到这一点。 它主要使用链接文件夹和.settings / org.eclipse.wst.common.component文件中的一点点黑客。 您可以在http://www.informit.com/articles/article.aspx?p=759232&seqNum=3上阅读有关它的文章,该章节称为“将Web模块划分为多个项目”。 这个问题是链接文件夹必须是相对于某个路径变量,可以在Window / Preferences / General / Workspace / Linked Resources选项卡中定义。 否则,链接文件夹定义(可以在项目根目录中的.project文件中找到)将包含工作站特定路径。 路径变量实际上应该是工作空间根。 这个解决方案适用于WTP,部署和其他所有工作都应该如此。

第二种解决方案是使用ant。 算了吧。 你会深感遗憾的。

第三种解决方案是使用maven。 如果你不做一些技巧,你可以忘记WTP出版的舒适度。 像其他人建议的那样使用战争叠加。 一定要安装m2eclipse,m2eclipse附加function。 最近发布了一个扩展插件,可以帮助您。 在这篇博客中描述。 我没试过,但看起来还不错。 无论如何Maven与链接文件夹无关,所以我认为即使是第一个解决方案,这个maven叠加层也可以在必要时共存。

对于无头构建,您可以使用HeadlessEclipse作为第一个解决方案。 它已经死了(由我),但仍然有效:)。 如果你使用maven overlay + eclipse的东西,无头构建由maven覆盖。

听起来像Maven WAR overlay会做你想要的。

这有点涉及,但在高层次我们这样做如下。 我们将核心平台ui划分为基于function的多个战争模块(login-ui,catalog-mgmt-ui等)。 这些核心模块中的每一个都可由面向客户的团队进行定制。

我们在构建时将所有这些模块合并为1个单一战争模块。 合并规则基于maven的程序集插件。

您通常从Java源代码开始。 WAR不包括Java源代码,只包括WEB-INF/classes下的编译WEB-INF/classesWEB-INF/libs下的JAR

我要做的是使用Maven并用它开始一个全新的空webapp项目: http : //maven.apache.org/guides/mini/guide-webapp.html

获得新的空项目结构后,将Java源代码复制到它( src/main/java )并填写pom.xml的依赖项列表。

完成所有这些后,您可以使用mvn clean package创建可以部署到Tomcat的标准WAR文件。

您可能希望设计具有基于接口的可插拔function的核心应用程序。

例如,假设您的核心应用程序具有User对象的一些概念,并且需要为基于用户的常见任务提供支持。 创建UserStore接口;

 public interface UserStore { public User validateUser(String username, String password) throws InvalidUserException; public User getUser(String username); public void addUser(User user); public void deleteUser(User user); public void updateUser(User user); public List listUsers(); } 

然后,您可以针对此接口编写核心应用程序(登录逻辑,注册逻辑等)。 您可能希望在核心应用程序中提供此接口的默认实现,例如实际上是DAO的DatabaseUserStore

然后,将UserStore定义为Spring bean并将其注入需要的位置;

    

这允许您根据特定客户的需求自定义或扩展核心应用程序。 如果客户想要将核心应用程序与其Active Directory服务器集成,则可以编写LDAPUserStore类, UserStore使用LDAP实现UserStore接口。 将其配置为Spring bean并将自定义类打包为依赖jar。

您剩下的是每个人都使用的核心应用程序,以及一组客户特定的扩展程序,您可以单独提供和销售; 哎呀,你甚至可以让客户写自己扩展。