【问题标题】:How to manage shared resources for several web apps in Maven AND Eclipse?如何在 Maven 和 Eclipse 中管理多个 Web 应用程序的共享资源?
【发布时间】:2011-06-24 18:47:37
【问题描述】:

注意:我在这个问题的第一个版本中没有得到任何回应,所以我将其修改为更通用...

上下文

我的项目分为几个 Maven 模块和几个 Web 应用程序。这是结构:

my-project
  + pom.xml
  +-- commons
  +-- persistence
  +-- ...
  +-- web-app-1
  +-- web-app-2
  +-- ...

所有 Web 应用程序共享公共资源,例如 JS、CSS 和图像文件。

我决定创建另一个名为web-resources 的项目,而不是在每个web-app-X 中复制这些资源,这是一个WAR 项目。 结构如下:

my-project
  + pom.xml
  +-- commons
  +-- persistence
  +-- ...
  +-- web-app-1
  +-- web-app-2
  +-- ...
  +-- web-resources
       +-- pom.xml
       +-- src/main/webapp
            +-- web.xml (which is almost empty, just need to be present for Maven)
            +-- web_resources
                 +-- css
                 +-- images
                 +-- javascript

Maven

在 Maven 2(或 Maven 3,因为我刚刚将项目迁移到 maven 3.0.2)中,此配置很容易管理,因为所有 web-app-X 都将 web-resources 声明为依赖项:

<groupId>foo.bar</groupId>
<artifactId>web-app-1</artifactId>
...
<dependencies>
    <dependency>
        <groupId>foo.bar</groupId>
        <artifactId>web-resources</artifactId>
        <version>${preclosing-version}</version>
        <type>war</type>
    </dependency>
    ...

因此,当我构建我的 WAR 项目时,它首先获取 web-resources.war(之前构建的),解压缩它,然后在其之上构建 web-app-X 网络应用程序。 这样,我的 WAR 文件还将包含一个名为 web-resources/ 的目录,其中包含共享资源。

这就是战争叠加原则。

所以从 Maven 的角度来看,一切都很好!


Eclipse

现在,主要问题来了:拥有良好的 Eclipse 配置。

问题:如何使用我当前的配置由 Eclipse 正确管理?特别是,当我使用 Eclipse 在 Tomcat 中部署任何 web-app-X 时...

请注意,我希望获得更自动化 (?) 的配置,并避免任何手动步骤,因为该配置应该被数十名开发人员使用...

对我来说,最好的解决方案似乎是使用 Eclipse 的链接资源。因此,我在web-app-X pom.xml 中设置了以下配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-eclipse-plugin</artifactId>
            <configuration>
                <wtpversion>1.5</wtpversion>
                <linkedResources>
                    <linkedResource>
                        <name>web_resources</name>
                        <type>2</type>
                        <location>${project.basedir}\..\web-resources\src\main\webapp\web_resources</location>
                    </linkedResource>
                </linkedResources>
            </configuration>
        </plugin>
        ...

当我运行mvn eclipse:eclipse 配置时,它会成功地将这些信息添加到我的.project 文件中:

<projectDescription>
  ...
  <linkedResources>
    <link>
      <name>web_resources</name>
      <type>2</type>
      <location>C:\dev\project\web-resources\src\main\webapp\web_resources</location>
    </link>
  </linkedResources>
<projectDescription>

现在,我在 Eclipse 中导入我的项目。 问题:在Project properties &gt; Java Build Path &gt; Source 中,我看不到链接源。 我只看到我的四个 Maven 默认目录(src/main/javasrc/main/resourcessrc/test/javasrc/test/resources)。 奇怪的是,当我尝试手动添加链接资源时,它拒绝并说它已经存在...

所以当我在 Eclipse 中的 Tomcat 上部署我的 Web 应用程序时,它确实没有部署 web_resources 目录,因此我没有部署 CSS / JS / 图像。

经过一些测试,看来我必须做两处修改:

  1. 在我的.classpath 文件中添加&lt;classpathentry kind="src" path="web_resources" output="src/main/webapp/web_resources"/&gt; 行;
  2. 删除.project文件中的&lt;project&gt;preclosing-web-resources&lt;/project&gt;

请注意,使用此配置,Eclipse 会复制(并保持同步)我的web-app-X/src/main/webapp/web_resources 中的 web_resources 项目的内容,但这不是问题(该目录被 SCM 忽略)。

我找到的唯一自动化解决方案是创建一个简单的 Maven 插件来完成前面的两个修改,然后运行以下命令(或使用 .bat 文件):

mvn eclipse:clean eclipse:eclipse myEclipsePlugin:eclipse

问题

  • 是否有更好的方法来管理此类配置?

技术资料

Java 6、Maven 3.0.2、maven eclipse 插件 2.8、Eclipse 3.3.2(但我可以使用更新版本的 Eclipse 进行测试)、没有 m2eclipse 插件。

【问题讨论】:

    标签: eclipse maven maven-eclipse-plugin


    【解决方案1】:

    从 Servlet 3.0 开始,您可以通过将资源放在 src/main/resources/META-INF/resources 目录中来共享资源。

    当 webapp 部署时,Servlet 3.0 会从上下文路径中提供这些资源。例如,在你的情况下......

    web-resources
    -- src
    ---- main
    ------ resources
    -------- META-INF
    ---------- resources
    ------------ css
    -------------- global.css
    ------------ images
    -------------- background.png
    

    假设 my_project 依赖于 web-resources 并部署到 url http://my.localhost:8080/myProject

    使用该配置,以下 URL 将解析为正确的资源:

    如果您的资源与您的实际应用程序之间存在名称冲突,则应用程序获胜。

    确保您的 web.xml 声明您使用的是 Servlet 3.0

    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
        version="3.0">
    

    【讨论】:

      【解决方案2】:

      您可能想看看这篇博文。它涵盖了一种使用 maven 共享资源的方法:

      http://www.sonatype.com/people/2008/04/how-to-share-resources-across-projects-in-maven/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-06
        • 1970-01-01
        • 1970-01-01
        • 2010-10-15
        • 2011-11-27
        • 1970-01-01
        相关资源
        最近更新 更多