【问题标题】:How to extend/customize a WAR with another project如何使用另一个项目扩展/自定义 WAR
【发布时间】:2011-05-04 12:48:25
【问题描述】:

我们的项目有以下场景:

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

我正在寻找有关在工具和项目配置方面执行此操作的最佳方法的建议。

我们目前正在使用 Ant,但希望避免被更多的 ant 埋没。有人用 Maven 做过吗?

我看过很多关于如何构建依赖于 java 应用程序的 web 应用程序的帖子,但没有关于依赖于另一个 web 应用程序的 web 应用程序的帖子。

谢谢!

【问题讨论】:

    标签: java eclipse spring jsp maven-2


    【解决方案1】:

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

    【讨论】:

    • maximdim 我一直在尝试使用 WAR 覆盖,但使用它我无法在父项目上进行修改的热部署。当我在父项目上修改类或静态文件(.js、.css)时,它不会反映在已部署的应用程序上。我正在使用netbeans。关于如何使这项工作的任何想法?这严重阻碍了发展。
    【解决方案2】:

    在 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 覆盖 + eclipse 的东西,无头构建被 maven 覆盖。

    【讨论】:

      【解决方案3】:

      这涉及更多一点,但在高层次上,我们按如下方式进行。我们将核心平台 ui 根据功能(login-ui、catalog-mgmt-ui 等)划分为多个 war 模块。这些核心模块中的每一个都可以由面向客户的团队进行定制。

      我们在构建期间将所有这些模块合并为一个单一的战争模块。合并规则基于 maven 的组装插件。

      【讨论】:

        【解决方案4】:

        您通常从 Java 源代码开始。 WARs 不包含 Java 源代码,仅包含 WEB-INF/classesJARs 下 WEB-INF/libs 下的编译类。

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

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

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

        【讨论】:

          【解决方案5】:

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

          例如,假设您的核心应用具有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 服务器集成,您可以编写一个 LDAPUserStore 类,该类使用 LDAP 实现您的 UserStore 接口。将其配置为 Spring bean,并将自定义类打包为依赖 jar。

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

          【讨论】:

            猜你喜欢
            • 2022-01-16
            • 1970-01-01
            • 2017-01-12
            • 2019-11-10
            • 2019-12-11
            • 2017-10-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多