Как управлять совместно используемыми ресурсами для нескольких веб-приложений в Maven AND Eclipse?

Примечание: я не получил ответа в первой версии этого вопроса, поэтому я изменил его на более общий...

Контекст

Мой проект разделен на несколько модулей maven и несколько веб-приложений. Вот структура:

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

Все веб-приложения имеют общие ресурсы, такие как 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. Таким образом, мой WAR файл будет содержать также каталог с именем web-resources/, который содержит общие ресурсы.

Это принцип наложения войны.

Итак, с точки зрения Maven, все в порядке!


Eclipse,

Теперь вот основная проблема: наличие хорошей конфигурации Eclipse.

Вопрос: Как я могу использовать мою текущую конфигурацию для правильного управления Eclipse? В частности, когда я развертываю любой web-app-X в Tomcat с помощью Eclipse...

Обратите внимание, что я хочу получить более автоматизированную (?) конфигурацию и избежать каких-либо действий вручную, так как эта конфигурация должна использоваться десятками разработчиков...

Для меня лучшее решение, похоже, использует связанные ресурсы 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/java и src/test/resources). Странно то, что когда я пытаюсь вручную добавить связанные ресурсы, он отказывается и говорит, что он уже существует...

Поэтому, когда я развертываю свое веб-приложение на своем Tomcat в Eclipse, он не развертывает каталог web_resources, и поэтому я не использую развернутые CSS/JS/изображения.

После некоторых тестов кажется, что я должен сделать две модификации:

  • Добавьте строку <classpathentry kind="src" path="web_resources" output="src/main/webapp/web_resources"/> в мой файл .classpath;
  • Удалите <project>preclosing-web-resources</project> в файле .project.

Обратите внимание, что с помощью этой конфигурации Eclipse копирует (и сохраняет синхронизацию) содержимое проекта web_resources в моем web-app-X/src/main/webapp/web_resources, но это не проблема (этот каталог игнорируется SCM).

Единственное автоматическое решение, которое я нашел, это создать простой плагин Maven, который выполняет две предыдущие модификации, а затем запустить следующую команду (или использовать файл .bat):

mvn eclipse:clean eclipse:eclipse myEclipsePlugin:eclipse

Вопрос

  • Есть ли лучший способ управления такой конфигурацией?

Техническая информация

Java 6, Maven 3.0.2, maven eclipse plugin 2.8, Eclipse 3.3.2 (но я могу протестировать с более новой версией Eclipse), no плагин m2eclipse.

Ответ 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 имеет зависимость от веб-ресурсов и развертывается на URL 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">