В java EE какие банки я должен поместить в библиотеку dir?

У меня есть проект Java EE. Проект построен с использованием maven в.ear архив. Существует библиотека jar, содержащая модуль персистентности JPA 2, который находится в каталоге библиотеки уха (так что его могут использовать несколько других модулей).

При добавлении реализации интерфейса Permission Shiro в качестве сущности в этом модуле персистентности у меня возникли проблемы с правильным развертыванием, так как классы Широ недоступны в модуле персистентности. В конце концов я понял, что мне нужно поместить все зависимости (примененные также к транзитивным командам) библиотечного фляги в каталог библиотеки, чтобы заставить его развернуться.

Итак, окончательный макет выглядит примерно так:

ear
`- lib
   `- persistence-unit.jar
    - shiro-core.jar
    - slf4j-api.jar
 - module1
 - moduleN
 - library1.jar
 - libraryN.jar

Теперь по вопросам:

  1. Есть ли какие-то руководящие указания для того, что следует поместить в каталог библиотеки, и является ли мое решение в целом приемлемым?
  2. Почему библиотеки в корне уха не доступны банкам в каталоге lib?
  3. Почему maven не может понять это автоматически?

РЕДАКТИРОВАТЬ: pom.xml для уха

<?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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ear</artifactId>
    <packaging>ear</packaging>

    <parent>
        <groupId>com.example</groupId>
        <artifactId>project</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-ear-plugin</artifactId>
                <version>2.7</version>
                <configuration>
                    <modules>
                        <webModule>
                            <!-- ... -->
                        </webModule>
                        <ejbModule>
                            <!-- ... -->
                        </ejbModule>
                        <jarModule>
                            <groupId>com.example</groupId>
                            <artifactId>persistence-unit</artifactId>
                            <bundleDir>lib</bundleDir>
                        </jarModule>

                        <-- I added these to get the deployment working -->
                        <jarModule>
                            <groupId>org.apache.shiro</groupId>
                            <artifactId>shiro-core</artifactId>
                            <bundleDir>lib</bundleDir>
                        </jarModule>
                        <jarModule>
                            <groupId>org.slf4j</groupId>
                            <artifactId>slf4j-api</artifactId>
                            <bundleDir>lib</bundleDir>
                        </jarModule>
                    </modules>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>persistence-unit</artifactId>
        </dependency>
        <dependency>
            <!-- ... -->
            <type>war</type>
        </dependency>
        <dependency>
            <!-- ... -->
            <type>ejb</type>
        </dependency>

        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
        </dependency>
    </dependencies>
</project>

И для персистентности блока:

<?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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>persistence-unit</artifactId>
    <packaging>jar</packaging>

    <parent>
        <groupId>com.example</groupId>
        <artifactId>project</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.jboss.spec</groupId>
            <artifactId>jboss-javaee-6.0</artifactId>
            <type>pom</type>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
        </dependency>
    </dependencies>
</project>

3 ответа

Решение

Есть ли какие-то руководящие указания относительно того, что следует поместить в каталог библиотеки, и является ли мое решение в целом приемлемым?

Вы в значительной степени прибили это, JAR, которые должны быть доступны для всех модулей EAR, должны быть здесь.

Почему библиотеки в корне уха не доступны банкам в каталоге lib?

Обычно это работает наоборот, банки в lib папки доступны для тех, кто в корне. Тем не менее, я считаю, что вы можете достичь этого с помощью <includeInApplicationXml>:

<jarModule>
    <groupId>org.nisse</groupId>
    <artifactId>hue</artifactId>
    <includeInApplicationXml>true</includeInApplicationXml>
</jarModule>

Почему maven не может понять это автоматически?

Я предполагаю, что вы имеете в виду, что maven автоматически не помещает все переходные зависимости в lib? Я полагаю, что так и должно быть, и можете ли вы показать соответствующую часть вашего ПОМ, возможно?

Редактировать: Ваш EAR-модуль должен ссылаться только на EJB JAR и WAR как зависимости. Любые переходные зависимости должны включаться в EAR автоматически, на верхнем уровне по умолчанию - это можно переопределить с помощью <defaultLibBundleDir> тег в ухо плагин <configuration>:

<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.7</version>
<configuration>
    <defaultLibBundleDir>lib</defaultLibBundleDir>
    <archive>
        <manifest>
            <addClasspath>true</addClasspath>
        </manifest>
    </archive>
    <modules>
       ... etc.

Так же <archive>/<addClasspath> раздел должен убедиться, что путь к классу MANIFEST установлен правильно. Возможно, это именно то, что вам не хватает?

Ура,

Я не буду комментировать конфигурацию Maven, но просто, куда библиотеки должны идти.

Существует два основных механизма совместного использования библиотек между модулями EAR - Bundled Libraries (описанные в EE.8.2.1 в спецификации Java EE 6) и Installed Libraries (EE.8.2.2).

Установленные библиотеки устанавливаются отдельно от EAR и, следовательно, совместно используются многими EAR на сервере приложений.

Связанные библиотеки могут быть установлены в lib (каталог библиотеки по умолчанию), каталог, указанный library-directory элемент дескриптора развертывания EAR и / или в любом каталоге, на который ссылается Class-Path заголовок манифеста модуля (или jar, на который ссылается модуль, который, в свою очередь, определяет транзитивную библиотеку).

Я понимаю спецификацию Java EE 6 так: Class-Path может ссылаться на любую библиотеку в любом месте EAR, но содержимое jar становится модулем EE, отличным от Java. Это означает, что persistence.xml не учитывается при развертывании, и потенциальные контексты постоянства, определенные в файле, не вступят в силу во время выполнения.

В твоем случае, persistence-unit.jar Кажется, он содержит конфигурации модулей персистентности и делает их доступными для других модулей, которые должны быть помещены в lib каталог. Другие две банки - shiro-core.jar а также slf4j-api.jar - может быть где угодно в EAR (включая lib каталог для простого развертывания - не нужно иметь Class-Path элемент в любой из ссылающихся библиотек / модулей).

В завершение, чтобы облегчить развертывание, ваши библиотеки в lib каталог, если Class-Path используется и указывает на другой каталог. В этом случае вы бы предпочли проверить, не является ли файл JAR, на который ссылаются, не JAR-файл Java EE с определением модуля персистентности, так как он не будет правильно развернут (и PU не будут доступны для модулей).

В этой статье есть большая таблица, объясняющая вещи:

Таблица 2 Стандартный архив может загружать классы, либо упакованные внутри него, либо из любых других архивов, от которых он зависит.

Module      Code Sources
EAR 
            All JARs in the /lib directory of the EAR
            Manifest Class-Path of any JARs in 1
EJB-JAR 
            EJB-JAR file itself
            JARs referenced by manifest Class-Path of EJB-JAR
            JARs referenced by manifest Class-Path of above JARs (in 2)
WAR 
            WEB-INF/classes
            JARs in WEB-INF/lib
            JARs referenced by manifest Class-Path of WAR
            JARs referenced by manifest Class-Path of JARs in 2 and 3
Другие вопросы по тегам