Упаковка общих классов в WAR с Maven и Eclipse - PullRequest
3 голосов
/ 14 июля 2011

У меня есть два проекта затмений на основе maven, один из которых является проектом с общими классами, а другое - веб-приложением Java EE, использующим их.

Теперь я знаю способ построить общий проект в виде фляги и добавить его в качестве зависимости от другого.

Но как бы я решил это, если бы я хотел, чтобы общие классы были непосредственно включены в WEB-INF / classes WAR?

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

Ответы [ 2 ]

0 голосов
/ 29 декабря 2011

Правильный способ - иметь два проекта Maven. Объявляя упаковку в вашей библиотеке как «jar», а веб-приложение как «war», maven будет использовать правильные плагины для сборки вашего приложения, как вы описали. Ваш сценарий довольно распространен, и помимо информации, которую я собираюсь вам предоставить, в документации Maven есть много информации об этом.

Ваш фляга библиотеки должна быть построена с помпой, подобной этой:

<?xml version="1.0" encoding="UTF-8"?>
<project
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.myproject.mypackage</groupId>
    <artifactId>my-lib</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>${project.artifactId}</name>
    <packaging>jar</packaging>

Ваше веб-приложение должно быть скомпоновано так:

<?xml version="1.0" encoding="UTF-8"?>
<project
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.myproject.mypackage</groupId>
    <artifactId>my-war</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>${project.artifactId}</name>

    <dependencies>
        <dependency>
            <groupId>com.myproject.mypackage</groupId>
            <artifactId>my-lib</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>

Когда вы создаете веб-приложение, maven автоматически включает вашу библиотеку Jar в каталог web-inf / lib. Никогда не помещайте файлы вручную в этот каталог, пусть Maven сделает всю тяжелую работу за вас.

РЕДАКТИРОВАТЬ: Вопрос заключался в том, как распаковать банку во время сборки, что является очень очень плохой идеей по множеству причин и плохой практики. Постоянные классы принадлежат EJB, а не WEB-INF / классам. Это также выведет вас за пределы стандартной поддержки Java EE ... Тем не менее, вот ответ:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.4</version>
    <executions>
        <execution>
            <id>unpack</id>
            <phase>package</phase>
            <goals>
                <goal>unpack-dependencies</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>com.myproject.mypackage</groupId>
                        <artifactId>my-lib</artifactId>
                        <version>1.0.0-SNAPSHOT</version>
                        <overWrite>true</overWrite>
                        <outputDirectory>WEB-INF/classes</outputDirectory>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>
0 голосов
/ 14 июля 2011

Вы можете использовать Плагин зависимости Maven , чтобы распаковать ваш артефакт .jar, содержащий общие классы, в целевую папку. Вам также необходимо сделать так, чтобы ваша исходная зависимость имела область действия provided, чтобы классы не включались ни в папку classes, ни (как .jar) в папку libs внутри полученной войны.

...