2012-03-27 3 views
4

Dieser Bedarf mag ein bisschen verschlungen klingen, und wenn ja, dann bin ich offen für Vorschläge hinsichtlich der besten Praktiken für die Implementierung. Mein Problem ist folgendes. Ich habe eine WAR-Webapp, die in einer EAR enthalten ist. Alles ist mavenisiert. In meiner Webapp versuche ich, die Artefakt-IDs und Versionsnummern des Ohres und des Krieges zu zeigen.Gibt es irgendeine Möglichkeit für eine Klasse innerhalb eines Krieges, von ihrem Ohr auf die META-INF zuzugreifen?

Der Krieg ist ein ziemlich einfacher Fall zu handhaben. Ich kann einfache Maven-Filterung verwenden, um die notwendige artifactId/versionId in den Krieg zu injizieren, während sie gebaut wird. Das Ohr ist jedoch komplizierter.

Ich weiß, dass es ein META-INF/maven /// pom.properties gibt, das ich im Ohr betrachten kann, das diese Information enthält, aber ich kann nicht sehen, um darauf zuzugreifen.

Ich habe versucht (von einer Jsp-Seite) das Folgende ohne Erfolg (alle mit und ohne führend /); alle Aufrufe geben null zurück:

getClass().getClassLoader().getResource("/META-INF/maven/<group>/<artifact>/pom.properties"); 
getClass().getClassLoader().getResourceAsStream("/META-INF/maven/<group>/<artifact>/pom.properties"); 

Ist das mit dem Classloader überhaupt machbar? Oder ist es Klassenlader-Konfiguration abhängig? Gibt es einen besseren Ansatz, um diese Informationen zu erhalten?

Ich führe derzeit Tests mit JBoss durch, aber die endgültige Bereitstellung wird auf WebSphere erfolgen. Idealerweise möchte ich jedoch eine Lösung, die nicht serverabhängig ist.

Danke!

Eric

Antwort

5

Ich glaube nicht, es wegen der Tatsache möglich ist, dass EARs, EJBs und WARs verschiedene Classloader haben, die miteinander nach einem universellen, berechenbar und Java EE weitem System verknüpft ist nicht notwendig .

Vor kurzem stieß ich auf dem ähnliche Problem, und die einzig akzeptable Lösung, die ich gefunden, wurde die Angabe env-entry in application.xml und es durch @Resource Injektion Lesen:

<application xmlns="http://java.sun.com/xml/ns/javaee" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd" 
      version="6"> 

    <!-- usual stuff goes here --> 
    <env-entry> 
    <description>application-wide property</description> 
    <env-entry-name>java:app/env/AppWideProperty</env-entry-name> 
    <env-entry-type>java.lang.String</env-entry-type> 
    <env-entry-value>stackoverflow.com</env-entry-value> 
    </env-entry> 


</application> 

und später in jeder Klasse:

public class CalcResultCachePool { 
    @Resource(lookup="java:app/env/AppWideProperty") 
    String appWideProperty; 

    // 
    // 
} 
+0

Danke für den Tipp. Das würde ganz gut funktionieren, aber ich scheine nicht in der Lage zu sein, die Injektion richtig funktionieren zu lassen. Ich habe das Ohr auf JBoss 7.0.2, aber der Env-Eintrag scheint nicht zu der Jndi-Struktur hinzugefügt werden. Auf welchem ​​Server haben Sie diesen Code erfolgreich ausgeführt? –

+0

Ignoriere meinen letzten Kommentar; hatte Probleme mit einer Konfigurationsdatei. Alles funktioniert jetzt gut. Vielen Dank! –

+0

Gern geschehen, froh, hilfsbereit zu sein – Osw

1

Haben Sie versucht, die ContextClassLoader der relevanten Artefakte zu verwenden? In Webanwendungen ist die ContextClassLoader die bevorzugte Methode zum Abrufen von Dateien aus dem Klassenpfad der implementierten Anwendung.

Thread.currentThread().getContextClassLoader().getResourceAsStream("/META-INF/maven/<group>/<artifact>/pom.properties"); 

Wenn Sie diesen Code Paket sowohl in der WAR-Datei und in einer JAR-Datei in Ihrer EAR, könnte dies die korrekte Information über den Classloader je zurückzukehren.

Haftungsausschluss: Dies funktioniert möglicherweise nicht auf allen Anwendungsservern gleich, da einige Anwendungsserver einen einheitlichen Classloader für Webanwendungen verwenden.

+0

Danke für den Tipp. Ich habe es nicht mit dem Thread-basierten Klassenlader versucht, da ich nach etwas gesucht habe, das servergenerisch wäre. @Osw hatte eine allgemeinere Lösung. –

Verwandte Themen