Maven - Создание одного файла войны на основе Java / сервлета из нескольких модулей - PullRequest
5 голосов
/ 06 марта 2012

На прошлой неделе я опубликовал вопрос о том, как я могу создавать зависимые модули, и в результате было рекомендовано использовать инструмент сборки, такой как Maven или Ivy.Я решил использовать Maven, чтобы попытаться достичь того, что я хотел бы сделать.Мой проект в основном строит один военный файл, который развернут в Tomcat.Сами модули являются частью окончательного файла войны.Вот пример структуры модулей

Модуль 1

customerModule
    |-webapp
        |-jsp
            |-customer
                |-findCustomer.jsp
                |-addNewCustomer.jsp
                |-deleteCustomer.jsp
    |-src
        |-com
            |-mycompany
                |-customer
                    |-FindCustomerAction.java
                    |-AddCustomerAction.java
                    |-DeleteCustomer.java

Модуль2

productModule
    |-webapp
        |-jsp
            |-product
                |-productCustomer.jsp
                |-addNewProduct.jsp
                |-deleteProduct.jsp
    |-src
        |-com
            |-mycompany
                |-product               
                    |-FindProductAction.java
                    |-AddProductAction.java
                    |-DeleteProduct.java            

Модуль 3

commonModule
    |-webapp
        |-css
            |-style.css
        |-jsp
            |-templates
                |-coreTemplate.jsp
    |-src
        com
            |-mycomany
                |-common
                    |-Logger.java
                    |-Access.java
    |-META-INF
        |-MANIFEST.MF
        |-context.xml
    |-WEB-INF
        |-lib
            |-oraclejdbc.lib
            |-log4j.lib
            |-common.lib
        |-struts-config.xml
        |-tiles-def.xml
        |-web.xml

Как вы, вероятно, видитеВсе вышеперечисленное все вместе образует одну заявку.То, что я хотел бы сделать, это закончить с артефактом для каждого модуля.Из-за смешения типов файлов (jsp, css, java) я не совсем уверен, что является подходящим артефактом.Диаграмма ниже показывает структуру файла войны, который я хотел бы закончить.

MyApp.war
    |-webapp
        |-css
            |-style.css
        |-jsp
            |-customer
                |-findCustomer.jsp
                |-addNewCustomer.jsp
                |-deleteCustomer.jsp
            |-product
                |-productCustomer.jsp
                |-addNewProduct.jsp
                |-deleteProduct.jsp     
            |-templates
                |-coreTemplate.jsp
    |-META-INF
        |-MANIFEST.MF
        |-context.xml
    |-WEB-INF
        |-lib
            |-oraclejdbc.lib
            |-log4j.lib
            |-common.lib
            |-customerModule.jar
            |-productModule.jar
        |-classes
            |-com
                |-mycomany
                    |-common
                        |-Logger.class
                        |-Access.class
        |-struts-config.xml
        |-tiles-def.xml
        |-web.xml   

Несколько замечаний - java-файлы в commonModule собраны и заканчиваются в WEB-INF / classes - java-файлы для customerModule заканчиваются как jar-файл в WEB-INF / lib -Java-файлы для productModule заканчиваются как файл jar в WEB-INF / lib - все jsps, css попадают в корень файла war

Как лучше всего хранить артефактдля каждого модуля в хранилище?

  • Я мог бы использовать файл JAR, но он не может содержать файлы типа html (jsp, css, js и т. д.)
  • Каждый модуль (кроме commonModule) будет содержать файл jar + файлы jsp, css.Я думаю о том, чтобы сохранить встроенный артефакт в виде zip-файла и извлечь его, когда MyApp.war создан для создания файла войны?
  • Могу ли я сохранить артефакт для каждого модуля в виде файла войны, даже если только одинесть файл web.xml?

Как я могу реализовать это с помощью Maven

  • Я исследовал Maven и обнаружил, что возможно иметьмногомодульный проект со следующей структурой

    MyApp.pom (родительский проект) commonModule.pom customer.pom product.pom

  • Если я заархивировал модули в хранилищекак бы я сослался на них из родительского проекта и разархивировал их для создания окончательного файла war?

  • Можно ли автоматически запускать сборку родительского проекта, если какой-либо из дочерних проектов создается?
  • Я не выяснил, как поддерживать версию каждого из дочерних проектов.Если я создаю проект заказчика, как родительский проект узнает, что в хранилище есть более новая версия customer.zip (или .jar)?
  • Предполагается, что в настоящее время хранилище содержит следующее

    |-productModule.v.0.1.zip

    |-customerModule.v.0.1.zip

    |-commonModule.v.0.1.zip

Если я перестраиваю, то customerModule, а затем перестраиваем военный файлКупить сборку родительского проекта, перестраивает ли maven все остальные модули в хранилище, даже если они не изменились?Как именно это будет работать?

Где-нибудь есть пример проекта, который демонстрирует, как достичь вышеуказанного?Любые ссылки или ресурсы, которые показывают пример вышеупомянутого, были бы очень полезны.

Ответы [ 2 ]

1 голос
/ 06 марта 2012

Сначала ваша структура выглядит неправильно, потому что макет папки по умолчанию для военного проекта выглядит так:

  +-- pom.xml (war packaging)
  +-- src/main/java (java Sources)
  +-- src/main/webapp (jsp pages etc.)
  +-- src/main/resources (language bundles etc.)

Более того, если вы хотите объединить все модули в один и тот же файл войны, но вы хотите разделить эти модули. Лучший способ - создать многомодульную сборку, которая выглядит следующим образом:

  root
  +-- pom.xml (parent of all)
  +-- mod-war (incl. pom.xml)
  +-- mod-1 (incl. pom.xml)
  +-- mod-2 (incl. pom.xml)

и создайте зависимости для mod-1 и mod-2 в pom mod-war. это приведет к тому, что они будут упакованы в один файл war, который содержит отдельный файл mod-1-VERSION.jar и т. д. Этот артефакт (файл war) можно развернуть в соответствующем репозитории, который сам может быть использован в качестве зависимости при необходимости.

Вы можете посмотреть здесь в качестве примера.

1 голос
/ 06 марта 2012

Честно говоря, лучшее, что можно сделать в вашей ситуации, - это создать файл .ear, содержащий каждую отдельную войну.В противном случае, если вы действительно хотите, чтобы ресурсы всех трех войн были объединены в одну войну, вы должны вручную объединить их.Java EE не имеет никаких спецификаций для объединения войн, подобных этой, так что даже если вам удастся сделать это с помощью какого-нибудь плагина / работы Maven, вокруг это все равно не будет чем-то потрясным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...