Hinzufügen eines externen Verzeichnisses zum Tomcat-Klassenpfad

69

Ich habe einen Ordner in meinem Laufwerk C: as C:\app_config\java_app Dieser Ordner enthält einige länderspezifische Eigenschaftendateien.

Ich habe eine Java-Klasse ( PrjPropertilesLocator), die die Eigenschaftendateien basierend auf dem Standardgebietsschema beim Start der Webanwendung lädt. Meine Webanwendung wird in Tomcat ausgeführt. Das Problem ist, wie ich dieses Verzeichnis C:\app_config\java_appim Tomcat-Klassenpfad festlegen soll , damit es für das ResourceBundle innerhalb der PrjPropertilesLocatorKlasse verfügbar wird . Gibt es eine Möglichkeit, diesen Ordner speziell für eine einzelne Webanwendung festzulegen, die ihn benötigt? Ich möchte die Eigenschaftendateien nicht in einem WEB-INF/classesOrdner ablegen .

Auf Weblogic läuft dies einwandfrei. Ich habe das Verzeichnis innerhalb des Weblogic-Klassenpfads in einem seiner Startskripte festgelegt und es funktioniert einwandfrei. Aber bei Tomcat habe ich versucht, es startup.batauch einzubauen, konnte es setclasspath.bataber nicht erfolgreich.

Rajat
quelle
1
Lesen Sie einfach unter diesem Link chemaxon.com/jchem/doc/admin/tomcat.html , dass tomcat keinen Systemklassenpfad verwendet. Ich habe alle Dateien aus dem Ordner C: / app_config / java_app in den Ordner <tomcat install> / lib kopiert und es hat funktioniert. Tomcat verwendet anscheinend keinen Systemklassenpfad. Können wir den Ordner C: \ app_config \ java_app in einer der Tomcats-Startdateien festlegen?
Rajat

Antworten:

127

Geben Sie es einfach in shared.loaderoder in der common.loaderEigenschaft von an /conf/catalina.properties.

BalusC
quelle
12
Ich frage mich, ob es eine Möglichkeit gibt, diese mithilfe von Befehlszeilenparametern anzugeben. Es wäre sehr praktisch, da ich keine Tomcat-Dateien ändern müsste, damit dies funktioniert ...
Matthias Hryniszak
4
Ich habe stundenlang nach dieser Lösung gesucht. Wieder einmal ist BalusC durchgekommen.
Rhys
1
Die Leute könnten daran interessiert sein, den Tomcat-Klassenpfad - Häufige Probleme und deren Behebung als einen wichtigen relevanten Artikel zu verstehen .
Dawngerpony
7
Die Antwort geht nicht auf die wichtigsten Anforderungen ein: "Gibt es eine Möglichkeit, diesen Ordner speziell für eine einzelne Web-App festzulegen, die ihn benötigt?"
Derek Mahar
1
Dies ist keine Lösung. Zwei Anwendungen können denselben Konfigurationsdateinamen verwenden, daher müssen Anwendungen aus Sicherheitsgründen über eigene eindeutige Klassenpfade verfügen.
Jacekn
28

Siehe auch Frage: Kann ich in Tomcat pro Anwendung einen benutzerdefinierten Klassenpfad erstellen?

Tomcat 7 Context Hold Loader- Element. Laut Docs kann der Deployment Descriptor (was in <Context>Tag) platziert werden in:

  • $CATALINA_BASE/conf/server.xml - schlecht - Server muss neu gestartet werden, um die Konfiguration erneut zu lesen
  • $CATALINA_BASE/conf/context.xml - schlecht - für alle Anwendungen freigegeben
  • $CATALINA_BASE/work/$APP.war:/META-INF/context.xml - schlecht - muss neu gepackt werden, um die Konfiguration zu ändern
  • $CATALINA_BASE/work/[enginename]/[hostname]/$APP/META-INF/context.xml- schön , aber siehe letzte Option !!
  • $CATALINA_BASE/webapps/$APP/META-INF/context.xml- schön , aber siehe letzte Option !!
  • $CATALINA_BASE/conf/[enginename]/[hostname]/$APP.xml- am besten - komplett außer Anwendung und automatisch nach Änderungen durchsucht !!!

Hier meine Konfiguration, die zeigt, wie die Entwicklungsversion von Projektdateien außerhalb der $CATALINA_BASEHierarchie verwendet wird (beachten Sie, dass ich diese Datei in src/test/resourcesdir und intruct Maven platziere, um ${basedir}Platzhalter vorzuverarbeiten, pom.xml <filtering>true</filtering>damit ich sie nach dem Erstellen einer neuen Umgebung kopiere $CATALINA_BASE/conf/Catalina/localhost/$APP.xml):

<Context docBase="${basedir}/src/main/webapp"
         reloadable="true">
    <!-- http://tomcat.apache.org/tomcat-7.0-doc/config/context.html -->
    <Resources className="org.apache.naming.resources.VirtualDirContext"
               extraResourcePaths="/WEB-INF/classes=${basedir}/target/classes,/WEB-INF/lib=${basedir}/target/${project.build.finalName}/WEB-INF/lib"/>
    <Loader className="org.apache.catalina.loader.VirtualWebappLoader"
            virtualClasspath="${basedir}/target/classes;${basedir}/target/${project.build.finalName}/WEB-INF/lib"/>
    <JarScanner scanAllDirectories="true"/>

    <!-- Use development version of JS/CSS files. -->
    <Parameter name="min" value="dev"/>
    <Environment name="app.devel.ldap" value="USER" type="java.lang.String" override="true"/>
    <Environment name="app.devel.permitAll" value="true" type="java.lang.String" override="true"/>
</Context>

UPDATE Tomcat 8 Änderungssyntax für <Resources> und <Loader>Elemente, entsprechender Teil sieht nun so aus:

<Resources>
    <PostResources className="org.apache.catalina.webresources.DirResourceSet"
                   webAppMount="/WEB-INF/classes" base="${basedir}/target/classes" />
    <PostResources className="org.apache.catalina.webresources.DirResourceSet"
                   webAppMount="/WEB-INF/lib" base="${basedir}/target/${project.build.finalName}/WEB-INF/lib" />
</Resources>
Gavenkoa
quelle
Hat jemand ein Beispiel dafür? Wir haben eine Weile damit herumgespielt, konnten aber dem Klassenpfad für die App keine ordnungsgemäßen Elemente hinzufügen.
Skeeterdrums
13

In Tomcat 6 wird der CLASSPATH in Ihrer Umgebung ignoriert. In setclasspath.bat sehen Sie

set CLASSPATH=%JAVA_HOME%\lib\tools.jar

dann wird es in Catalina.bat so verwendet

%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% 
-Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" 
-Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" 
-Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

Ich sehe keine anderen Variablen, die enthalten sind. Ich denke, Sie müssen setclasspath.bat nicht mehr bearbeiten und die Erstellung von CLASSPATH ändern. Für Tomcat 6.0.20 war diese Änderung wie 74 von setclasspath.bat

set CLASSPATH=C:\app_config\java_app;%JAVA_HOME%\lib\tools.jar
Trenton
quelle
5

Ich schlage vor, Sie fügen ein META-INFVerzeichnis mit einer MANIFEST.MFDatei in der .war-Datei hinzu.

Bitte beachten Sie, dass es sich laut Servlet-Spezifikation um eine .war-Datei und nicht um ein .war-Verzeichnis handeln muss, damit der META-INF/MANIFEST.MFContainer sie lesen kann.

Bearbeiten Sie die MANIFEST.MFClass-Path-Eigenschaft wie folgt C:\app_config\java_app:

Siehe Verwenden von JAR-Dateien: Die Grundlagen (Das Manifest verstehen)

Genießen.

Koekiebox
quelle
Nun, es funktioniert nicht bei mir. Beachten Sie die Quellen: Möglicherweise müssen Sie Klassen in anderen JAR-Dateien aus einer JAR-Datei heraus referenzieren. Der Weg funktioniert vielleicht für jar, aber nicht für meine Webanwendung.
WesternGun
2

Sie können eine neue Datei, setenv.sh (oder setenv.bat), im Verzeichnis tomcats bin erstellen und dort die folgende Zeile hinzufügen

export CLASSPATH=$CLASSPATH:/XX/xx/PATH_TO_DIR
Sudhir N.
quelle
0

Ich bin vielleicht etwas spät dran für die Party, aber ich folge den folgenden Schritten, um sie mithilfe des IntelliJ-In-IDE-App-Tests vollständig konfigurierbar zu machen. Ich glaube, der beste Weg ist, unten mit der Antwort von @ BelusC zu kombinieren.

1. run the application using IDE's tomcat run config. 
2. ps -ef | grep -i tomcat //this will give you a good idea about what the ide doing actually.
3. Copy the -Dcatalina.base parameter value from the command. this is your application specific catalina base. In this folder you can play with catalina.properties, application root path etc.. basically everything you have been doing is doable here too. 
Olgun Kaya
quelle