2013-02-14 7 views
10

Ho un progetto Java EE. Il progetto è stato realizzato utilizzando maven in un archivio .ear. C'è un barattolo di libreria contenente un'unità di persistenza JPA 2, che si trova nella directory della libreria dell'orecchio (quindi più altri moduli possono usarlo).In Java EE, quali vasi devo inserire nella directory della libreria?

Aggiungendo un'implementazione dell'interfaccia di autorizzazione di Shiro come un'entità in questa unità di persistenza, ho avuto difficoltà a distribuire l'orecchio correttamente, perché le classi shiro non erano disponibili nell'unità di persistenza. Alla fine ho capito che avevo bisogno di mettere tutte le dipendenze (applicate anche ai deps transitivi) del jar della libreria nella directory della libreria per farlo distribuire.

Così il layout finale sembrano grosso modo così:

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

Ora, per le domande:

  1. Esistono linee guida per quello che dovrebbe essere messo nella directory di libreria, ed è il mio soluzione generalmente accettabile?
  2. Perché le librerie nella radice dell'orecchio non sono disponibili per i jar nella directory lib?
  3. Perché Maven non lo rileva automaticamente?

EDIT: pom.xml per l'orecchio

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

E per l'unità di persistenza:

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

risposta

7

Esistono linee guida per quello che dovrebbe essere messo nella directory di libreria e la mia soluzione è generalmente accettabile?

Hai praticamente inchiodato, i JAR che dovrebbero essere disponibili per tutti i moduli EAR dovrebbero andare qui.

Perché le librerie nella radice dell'orecchio non sono disponibili per i jar nella directory lib?

Di solito funziona in senso inverso, i JAR nella cartella lib sono disponibili per quelli nella radice. Tuttavia, credo che si può ottenere questo utilizzando <includeInApplicationXml>:

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

Perché non figura Maven questo fuori automaticamente?

suppongo che voi dire che Maven non pone automaticamente tutte le dipendenze transitive in lib? Credo che dovrebbe fare, e lo fa - puoi mostrare la parte rilevante della tua POM, forse?

Modifica: Il modulo EAR deve fare riferimento solo ai JAR EJB e WAR come dipendenze.Eventuali dipendenze transitive dovrebbero essere inclusi nel EAR automaticamente, al massimo livello di default - questo può essere sovrascritto con il tag <defaultLibBundleDir> nell'orecchio-plugin <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. 

anche la sezione <archive>/<addClasspath> dovrebbero garantire che il manifesto classpath è impostato correttamente. Forse questo è esattamente quello che ti manca?

Cheers,

+0

La tua ipotesi circa la domanda 3 è corretta. Ho aggiornato la domanda con i poms. Semplificato, ma spero abbastanza e senza rimuovere il vero problema :) –

+0

Ho aggiunto più informazioni alla mia risposta, spero che ti aiuti un po 'oltre - almeno il 'addClasspath' potrebbe essere quello che ti serve.Sono in dubbio se il tuo problema è far sì che Maven in realtà includa dee transitori o semplicemente che siano disponibili sul classpath. Se quest'ultimo, penso che questo è proprio quello che ti serve. Saluti, –

5

io non commentare la configurazione di Maven, ma semplicemente dove le librerie dovrebbe andare.

Ci sono due meccanismi principali per condividere librerie tra i moduli di un orecchio - biblioteche bundle (descritto nel EE.8.2.1 in the Java EE 6 specification) e librerie installate (EE.8.2.2).

Le librerie installate sono installate separatamente da un EAR e pertanto sono condivise tra molte EAR su un server applicazioni.

pacchetti integrati di biblioteche possono essere installati in lib (directory libreria di default), una directory specificata dall'elemento library-directory del descrittore di deployment di un EAR e/o in qualsiasi directory a cui fa riferimento la Class-Path manifesta intestazione di un modulo (o un vaso referenziato da un modulo che a sua volta definisce una libreria transitiva).

La mia comprensione del Java EE 6 specifica è che Class-Path possono fare riferimento a qualsiasi libreria in qualsiasi parte di un orecchio, ma il contenuto del vaso diventa allora un modulo non-Java EE. Significa che persistence.xml non viene considerato durante la distribuzione e che i contesti di persistenza potenziali definiti nel file non avranno effetto in fase di runtime.

Nel tuo caso, persistence-unit.jar sembra contenere configurazioni di unità di persistenza e per renderle disponibili agli altri moduli deve essere inserito nella directory lib. Gli altri due vasi - shiro-core.jar e slf4j-api.jar - possono trovarsi ovunque nell'EAR (inclusa la directory lib per una semplice distribuzione - non è necessario disporre dell'elemento Class-Path in nessuna delle librerie/moduli di riferimento).

Avvolgendolo, per facilitare l'implementazione sono disponibili le librerie nella directory lib a meno che non venga utilizzato Class-Path e punti a un'altra directory. In questo caso, dovresti controllare se il file jar di riferimento non è un jar Java EE con una definizione di unità di persistenza in quanto non verrà distribuito correttamente (e le unità di elaborazione non saranno disponibili per i moduli).

3

This article ha un ottimo tavolo spiegare le cose:

Tabella 2 Un archivio standard può caricare classi o confezionati all'interno dello stesso o da altri archivi è dipendente.

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