lib - tomcat classloader
Agregar un directorio a tomcat classpath (5)
Tengo una carpeta en mi unidad C:/app_config/java_app
Esta carpeta contiene algunos archivos de propiedades específicos de la configuración regional.
Tengo una clase java ( PrjPropertilesLocator
) que carga los archivos de propiedades según la configuración regional predeterminada en el inicio de la aplicación web. Mi aplicación web se ejecuta dentro de tomcat. El problema es cómo debería establecer este directorio C:/app_config/java_app
en el classpath de C:/app_config/java_app
para que esté disponible para ResourceBundle dentro de la clase PrjPropertilesLocator
. ¿Hay alguna manera de configurar esta carpeta específicamente para una aplicación web única que lo necesite? No quiero poner los archivos de propiedades dentro WEB-INF/classes
carpeta WEB-INF/classes
.
En weblogic, esto funciona bien. Configuré el directorio dentro del classpath weblogic en uno de sus scripts de inicio y funciona bien. Pero en Tomcat intenté ponerlo en startup.bat
también en setclasspath.bat
, pero no pude hacerlo con éxito.
En Tomcat 6, se ignora el CLASSPATH en su entorno. En setclasspath.bat verás
set CLASSPATH=%JAVA_HOME%/lib/tools.jar
luego en catalina.bat, se usa como tal
%_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%
No veo ningún otro vars que esté incluido, así que creo que estás atascado con la edición de setclasspath.bat y cambiando la forma en que se construye CLASSPATH. Para Tomcat 6.0.20, este cambio fue como 74 de setclasspath.bat
set CLASSPATH=C:/app_config/java_app;%JAVA_HOME%/lib/tools.jar
Lo que sugiero que hagas es agregar un directorio META-INF
con un archivo MANIFEST.MF
en el archivo .war.
Tenga en cuenta que, de acuerdo con las especificaciones del servlet, debe ser un archivo .war y no .war para que el archivo META-INF/MANIFEST.MF
se lea por contenedor.
Edite la propiedad MANIFEST.MF
Class-Path en C:/app_config/java_app
:
Consulte Uso de archivos JAR: Aspectos básicos (Comprender el manifiesto)
Disfrutar.
Puede crear un nuevo archivo, setenv.sh (o setenv.bat) dentro del directorio de tomcats bin y agregar la siguiente línea allí
export CLASSPATH=$CLASSPATH:/XX/xx/PATH_TO_DIR
Solo especifíquelo en la propiedad shared.loader
o common.loader
de /conf/catalina.properties
.
Ver también pregunta: ¿Puedo crear una ruta de clase personalizada por aplicación en Tomcat
Tomcat 7 Context hold Loader element. De acuerdo con el descriptor de implementación de Context (lo que en la etiqueta <Context>
) se puede colocar en:
-
$CATALINA_BASE/conf/server.xml
- bad - require server reinicia para volver a leer config -
$CATALINA_BASE/conf/context.xml
- malo - compartido en todas las aplicaciones -
$CATALINA_BASE/work/$APP.war:/META-INF/context.xml
- bad - requiere reempaquetado para cambiar las configuraciones -
$CATALINA_BASE/work/[enginename]/[hostname]/$APP/META-INF/context.xml
- ¡¡¡ bien , pero mira la última opción !! -
$CATALINA_BASE/webapps/$APP/META-INF/context.xml
- ¡$CATALINA_BASE/webapps/$APP/META-INF/context.xml
, pero mira la última opción! -
$CATALINA_BASE/conf/[enginename]/[hostname]/$APP.xml
- lo mejor - completamente fuera de aplicación y escaneado automáticamente en busca de cambios.
Aquí mi configuración que demuestra cómo usar la versión de desarrollo de los archivos de proyecto fuera de la jerarquía $CATALINA_BASE
(tenga en cuenta que coloco este archivo en el directorio src/test/resources
e instalo Maven para preprocesar marcadores de posición ${basedir}
través de pom.xml
<filtering>true</filtering>
así que después de compilar en un nuevo entorno, lo copio en $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>
ACTUALIZACIÓN Tomcat 8 cambia la sintaxis de los elementos <Resources>
y <Loader>
, la parte correspondiente ahora se ve así:
<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>