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

时间:2010-11-03 14:23:15

标签: java eclipse spring jsp maven-2

我们的项目有以下情况:

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

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

我们目前正在使用Ant,但我希望避免被蚂蚁埋没。有人用Maven做过这个吗?

我已经看过很多关于如何构建依赖于java应用程序的Web应用程序的帖子,但Web应用程序上没有任何内容取决于其他Web应用程序。

谢谢!

5 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

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

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

答案 4 :(得分:0)

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

例如,假设您的核心应用程序具有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<User> listUsers();
}

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

然后将UserStore定义为Spring bean并将其注入需要的地方;

<bean id="userStore" class="com.mycorp.auth.DatabaseUserStore">
    <constructor-arg ref="usersDataSource"/>
</bean>

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

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