In java EE, welche Gläser sollte ich in die Bibliothek dir?
Ich habe ein Java-EE-Projekt. Das Projekt ist gebaut mit maven in ein .ear-Archiv. Es ist eine Bibliothek, die Dose mit einem JPA 2 persistence unit, die sich im library Verzeichnis des ear (also von mehreren anderen Module können es).
Beim hinzufügen einer Umsetzung von Shiro ' s Erlaubnis-Schnittstelle als eine Einheit in dieser Persistenz-unit, hatte ich Mühe, das Ohr korrekt implementieren, da der shiro Klassen wo nicht verfügbar in der persistenzeinheit. Ich habe letztendlich herausgefunden, dass ich brauchte, um alle Abhängigkeiten (auch für transitive Abhängigkeiten) der jar-Bibliothek im Bibliotheks-Verzeichnis, um es zu implementieren.
Also das Letzte layout in etwa so Aussehen:
ear
`- lib
`- persistence-unit.jar
- shiro-core.jar
- slf4j-api.jar
- module1
- moduleN
- library1.jar
- libraryN.jar
Nun, für die Fragen:
- Gibt es irgendwelche Richtlinien für das, was sein sollte, setzen Sie in das library Verzeichnis, und ist meine Lösung in der Regel akzeptabel?
- Warum nicht die Bibliotheken in das Stammverzeichnis der ear zur Verfügung, um die jars in das lib-Verzeichnis?
- Warum nicht maven Abbildung dies automatisch?
BEARBEITEN: pom.xml für das Ohr
<?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>
Und für die Persistenz-unit:
<?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>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du hast ziemlich viel nagelte ihn, Gläser, die sollten für alle die EAR-Module sollten hier gehen.
Es in der Regel Umgekehrt funktioniert, die Gläser in der
lib
Ordner sind verfügbar, um diejenigen, die in der Wurzel. Ich glaube jedoch, Sie können dies erreichen, mit<includeInApplicationXml>
:Ich nehme an, du meinst, dass maven nicht automatisch alle transitiven Abhängigkeiten in
lib
? Ich glaube, dass er es tun sollte, und tut - kann Sie zeigen den relevanten Teil Ihres POM vielleicht?Edit: OHR-Modul sollte nur auf die EJB-JARs und WARs, da Abhängigkeiten. Alle transitiven Abhängigkeiten einbezogen werden sollten in das OHR automatisch auf der obersten Ebene standardmäßig - dies kann überschrieben werden, mit der
<defaultLibBundleDir>
tag-im Ohr-plugin<configuration>
:Auch die
<archive>
/<addClasspath>
Abschnitt soll sicherstellen, dass die MANIFEST-classpath korrekt gesetzt ist. Vielleicht ist dies genau das, was Ihnen fehlt?Cheers,
addClasspath
könnte das sein, was Sie brauchen. Ich bin im Zweifel, ob Ihr Problem ist immer maven tatsächlich umfassen transient deps oder einfach nur haben Sie auf dem Klassenpfad. Wenn letzteres, ich denke, das ist genau das, was Sie brauchen. Cheers,Ich werde nicht Kommentar auf die Konfiguration von Maven, sondern nur, wo die Bibliotheken gehen sollte.
Dort sind zwei wichtigsten Mechanismen, die die Bibliotheken gemeinsam nutzen, die unter einer EAR-Module - Gebündelt Bibliotheken (beschrieben in EE.8.2.1 in die Java-EE-6-Spezifikation) und Installierten Bibliotheken (EE.8.2.2).
Installierten Bibliotheken installiert sind separat aus dem OHR und sind daher untereinander teilen viele Ohren, die auf einem application server.
Gebündelt Bibliotheken installiert werden kann, in
lib
(die Standard-Bibliothek-directory), ein Verzeichnis spezifiziert durch dielibrary-directory
element eines EAR-deployment-Deskriptor und/oder in einem Verzeichnis verwiesen werden, die mit derClass-Path
manifest-header ein Modul (oder ein Glas verwiesen wird, die von einem Modul, das wiederum definiert eine transitive Bibliothek).Mein Verständnis von Java-EE-6-Spezifikation ist, dass
Class-Path
können auf eine Bibliothek überall im OHR, aber der Inhalt des Glases, wird dann eine nicht-Java-EE-Modul. Es bedeutet, dasspersistence.xml
ist nicht als nach der Bereitstellung und mögliche Persistenz-Kontexte in der Datei definiert wird keinen Effekt zur Laufzeit.In deinem Fall
persistence-unit.jar
scheint zu enthalten, die Persistenz-unit-Konfigurationen und zur Verfügung zu stellen, um die anderen Module, die es in derlib
- Verzeichnis. Die beiden anderen Krüge -shiro-core.jar
undslf4j-api.jar
- können überall im OHR (einschließlich derlib
directory-für eine einfache Installation - keine Notwendigkeit, habenClass-Path
element in jeder von den verweisen auf die Bibliotheken/Module).Zusammenfassung, zur Vereinfachung der Ausbringung haben, Ihre Bibliotheken in die
lib
Verzeichnis, sofernClass-Path
verwendet wird und verweist auf ein anderes Verzeichnis. In diesem Fall, solltest du eher prüfen, ob die Referenzierung jar-Datei ist keine Java EE-jar-persistence unit-definition, wie Sie nicht eingesetzt richtig (und Eiter nicht verfügbar sein, um die Module).Dieser Artikel hat einen großen Tisch Dinge zu erklären: