如何在Maven和Eclipse中管理多个Web应用程序的共享资源?

时间:2011-02-10 11:03:06

标签: eclipse maven maven-eclipse-plugin

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

上下文

我的项目分为几个maven模块和几个web应用程序。结构如下:

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

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

我没有在每个web-app-X中复制这些资源,而是决定创建另一个名为web-resources的项目,这是一个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 web-应用。 这样,我的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 > Java Build Path > Source中,我没有看到链接源存在。 我只看到我的四个Maven默认目录(src/main/javasrc/main/resourcessrc/test/javasrc/test/resources)。 奇怪的是,当我尝试手动添加链接资源时,它拒绝并说它已经存在......

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

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

  1. 在我的<classpathentry kind="src" path="web_resources" output="src/main/webapp/web_resources"/>文件中添加行.classpath;
  2. 删除<project>preclosing-web-resources</project>文件中的.project
  3. 请注意,使用此配置,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插件。

2 个答案:

答案 0 :(得分:6)

从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 依赖于网络资源,并将其部署到网址http://my.localhost:8080/myProject

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

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

确保您的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">

答案 1 :(得分:1)

您可能想看一下这篇博客文章。它介绍了使用maven共享资源的方法:

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