Упаковка общих классов в WAR с помощью maven и eclipse

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

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

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

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


person Alexander Rühl    schedule 14.07.2011    source источник
comment
Если вы нашли какие-либо ответы полезными или если они доказали, что то, о чем вы просили, не может быть сделано, обязательно примите их, ответьте и проголосуйте за них :-)   -  person Jonathan S. Fisher    schedule 06.01.2012


Ответы (2)


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

Ваша библиотечная банка должна быть построена с помощью pom, похожего на это:

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

Ваше веб-приложение должно быть построено с помощью pom, похожего на это:

<?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>
person Jonathan S. Fisher    schedule 29.12.2011
comment
Спасибо за возрождение старого вопроса, он все еще может быть полезен. Но в моем вопросе есть одна деталь, которую вы, возможно, упустили из виду: я не собирался добавлять файл jar в WEB-INF/lib, а добавлял скомпилированные классы из общего проекта непосредственно в WEB-INF/classes, как если бы они были частью исходного дерева второго проекта. Причиной этого был тот факт, что конфигурация сохраняемости из common не распознавалась при помещении в common.jar. - person Alexander Rühl; 02.01.2012
comment
Если это проект JEE, ваши классы персистентности должны войти в EJB, а не в WEB-INF/классы, и они будут распознаны автоматически. Я бы _STRONGLY_ посоветовал придерживаться лучших практик и следовать этому образцу. Если вы действительно хотите распаковать банку и готовы принять множество проблем, с которыми вы столкнетесь в будущем, вы можете использовать для этого подключаемый модуль зависимости maven. - person Jonathan S. Fisher; 02.01.2012
comment
Вы правы насчет лучших практик, я не собирался их нарушать. Может быть, я сделал что-то еще не так. У меня были стандартные объекты POJO, и я поместил их в файл common.jar. Я также поместил в него файл persistence.xml. Но при использовании этого кувшина на войне контейнер не смог использовать сущностей и пожаловался на это. Вот почему я попытался поместить классы непосредственно в войну. Так что, если вы можете указать мне пример проекта, оформленного таким образом, я был бы очень признателен. - person Alexander Rühl; 03.01.2012
comment
Если вы хотите использовать классы сущностей прямо в своем приложении, вы можете использовать Spring для создания экземпляра контейнера сохранения. Однако это действительно раздует ваше приложение, а у Spring есть своя кривая обучения. Если вы используете Eclipse, создайте новый проект EJB. Добавьте аспект JPA2.0 в свой проект. Создайте классы сохраняемости из подключения к базе данных в Eclipse. Я делаю это весь день на работе, но у меня нет примера «общественного достояния», только учебные пособия... - person Jonathan S. Fisher; 06.01.2012
comment
Хорошо, я попробую ваши предложения, но сейчас не могу этого сделать из-за других тем, хотя я приму это как решение. В любом случае, я буду признателен за ссылку на хороший учебник в этом направлении! - person Alexander Rühl; 06.01.2012
comment
Eclipse позаботится о большей части шаблонного кода... В EJB вы поместите следующее: @PersistenceContext private EntityManager em; Вот легко читаемая ссылка на EJB3.0 refcardz.dzone.com/refcardz/ внедрение зависимостей в ejb3 и вот довольно простое руководство по началу работы с EJB3.0 caucho.com/resin-3.0/ejb3/tutorial/stateless/index.xtp - person Jonathan S. Fisher; 06.01.2012
comment
Если вы хотите по-настоящему фантазировать, maven может даже сгенерировать вашу банку ejb-client! - person Jonathan S. Fisher; 06.01.2012

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

person Waldheinz    schedule 14.07.2011
comment
Спасибо за подсказку. Но поскольку я совершенно новичок в maven, я не уверен, как правильно его использовать. Я адаптировал указанный вами пример, но он не упаковал его в развернутую войну внутри затмения. Кроме того, он жаловался на отсутствие поддержки распаковки в m2e. - person Alexander Rühl; 15.07.2011