2011-02-10 50 views
11

注:我没有在这个问题上的第一个版本的任何回应,所以我修改它是更通用...如何在Maven和Eclipse中管理多个Web应用程序的共享资源?

语境

我的项目分为几个行家模块和几个网络应用程序。这里是结构:

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

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

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

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 ...

注意,我想获得更多的automatizable(?)的配置,并且避免任何手动步骤,因为这样的配置应该由数十名开发人员使用。 ..

对我来说,最好的解决方案似乎使用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/java,src/main/resources,src/test/javasrc/test/resources)。 奇怪的是,当我尝试手动添加链接的资源,它拒绝,并说,它已经存在......

所以,当我在Eclipse我的Tomcat部署我的web应用程序,它部署web_resources目录,因此我没有获得部署的CSS/JS /图像。

一些测试之后,似乎我要做两处修改:

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

注意,使用此配置,Eclipse将拷贝(并保持同步)web_resources项目的内容在我的web-app-X/src/main/webapp/web_resources,但这不是问题(这个目录是由单片机忽略)。

唯一的自动化的解决方案,我发现是创建一个简单的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插入。

回答

6

从Servlet 3.0开始,你可以把它们中的src /主/资源/ META-INF/resources目录中的共享资源。

当webapp部署时,Servlet 3.0使这些资源可以从上下文路径中获得。例如,在你的情况下...

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

让我们假设MY_PROJECT网络资源的依赖,并部署到URL http://my.localhost:8080/myProject

通过这种结构,以下网址解析到正确的资源:

IF你有足够的资源和实际应用之间的名称冲突,应用程序将赢得胜利。

确保您使用的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"> 
你的web.xml声明
相关问题