В 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
Теперь по вопросам:
- Есть ли какие-то руководящие указания для того, что следует поместить в каталог библиотеки, и является ли мое решение в целом приемлемым?
- Почему библиотеки в корне уха не доступны банкам в каталоге lib?
- Почему 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