使用VirtualWebappLoader运行带有自定义类路径的tomcat7 maven插件

时间:2013-03-21 08:32:08

标签: tomcat7 maven-3 maven-tomcat-plugin

我有一个maven war 项目,我正在尝试使用tomcat7-maven-plugin运行。我遇到的问题是每个环境的配置都在自定义文件夹中(它不在内部/资源中),因为我们为每个环境(本地,测试,uat或生产)提供了一组不同的配置文件。 / p>

我正在尝试弄清楚如何运行插件,同时指定包含本地配置目录的自定义类路径。我已经阅读了improvement ticket这样做的方法,就是提供一个带有Loader元素的context.xml,但如果我这样做,webapp就无法启动。

我在pom中的配置是

     <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.0</version>
        <configuration>
           <path>/${project.build.finalName}</path>
           <contextFile>${basedir}/src/env/local/context.xml</contextFile>
           <contextReloadable>true</contextReloadable>
        </configuration>
     </plugin>

context.xml文件(tomcat插件自动对此文件进行过滤)

<?xml version="1.0" encoding="UTF-8"?>
<Context>
   <Loader className="org.apache.catalina.loader.VirtualWebappLoader" 
           virtualClasspath="${basedir}/src/env/local/" />

   <JarScanner scanAllDirectories="true" />
</Context>

我得到的错误是

[INFO] create webapp with contextPath: /webapp
Handler error
java.lang.ClassNotFoundException: org.apache.juli.FileHandler
        at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at org.apache.juli.ClassLoaderLogManager.readConfiguration(ClassLoaderLogManager.java:521)
        at org.apache.juli.ClassLoaderLogManager.readConfiguration(ClassLoaderLogManager.java:464)
        at org.apache.juli.ClassLoaderLogManager$2.run(ClassLoaderLogManager.java:377)
        at org.apache.juli.ClassLoaderLogManager$2.run(ClassLoaderLogManager.java:373)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.apache.juli.ClassLoaderLogManager.getClassLoaderInfo(ClassLoaderLogManager.java:373)
        at org.apache.juli.ClassLoaderLogManager.readConfiguration(ClassLoaderLogManager.java:452)
        at org.apache.juli.ClassLoaderLogManager$2.run(ClassLoaderLogManager.java:377)
        at org.apache.juli.ClassLoaderLogManager$2.run(ClassLoaderLogManager.java:373)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.apache.juli.ClassLoaderLogManager.getClassLoaderInfo(ClassLoaderLogManager.java:373)
        at org.apache.juli.ClassLoaderLogManager.getLogger(ClassLoaderLogManager.java:223)
        at java.util.logging.LogManager.demandLogger(LogManager.java:389)
        at java.util.logging.Logger.getLogger(Logger.java:288)
        at org.apache.juli.logging.DirectJDKLog.<init>(DirectJDKLog.java:71)
        at org.apache.juli.logging.DirectJDKLog.getInstance(DirectJDKLog.java:196)
        at org.apache.juli.logging.LogFactory.getInstance(LogFactory.java:170)
        at org.apache.juli.logging.LogFactory.getLog(LogFactory.java:311)
        at org.apache.catalina.core.ContainerBase.getLogger(ContainerBase.java:452)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5162)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:662)

有没有人有任何关于如何解决这个问题或以不同方式实现相同目标的建议?

我已经能够用货物插件做到这一点,但是tomcat插件有一些我喜欢的功能:)。

0 个答案:

没有答案