Tomcat webapp 类加载器不支持运行时编译

问题描述 投票:0回答:3

我有一些在运行时生成并使用

编译的 Java 类

JavaCompiler.CompilationTask

生成的代码引用了其他项目中的类,这些类是我的项目的 Maven 依赖项。一切在本地运行良好,但是当我部署到我们的开发 Tomcat 服务器时,我得到了一堆

"package xxx does not exist"

"cannot find symbol"

编译任务出错。我检查了Tomcat部署的webapp项目的WEB-INF/lib目录,所有的jar都在那里,包括项目依赖项。

WEB-INF/lib
目录中的所有内容不是都应该在运行时可供 Tomcat 项目使用吗?

编辑:这是我的 context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Loader className="org.apache.catalina.loader.VirtualWebappLoader"
        virtualClasspath="${catalina.home}/webapps/kdweb/WEB-INF/lib/acommons-0.0.1-SNAPSHOT.jar;${catalina.home}/webapps/kdweb/WEB-INF/lib/abizcommons-0.0.1-SNAPSHOT.jar;${catalina.home}/webapps/kdweb/WEB-INF/lib/kd_market_data-common-0.0.1-SNAPSHOT.jar;${catalina.home}/webapps/kdweb/WEB-INF/lib/aggregation-0.0.1-SNAPSHOT.jar;${catalina.home}/webapps/kdweb/WEB-INF/lib/apods-client-0.0.1-SNAPSHOT.jar;${catalina.home}/webapps/kdweb/WEB-INF/lib/framework-common-0.0.1-SNAPSHOT.jar" />
</Context>
java tomcat maven
3个回答
1
投票

您可以使用Loader并将可重新加载设置为true。(This也可能相关)


1
投票

事实证明,我需要将显式类路径传递给代码中的 JavaCompiler.CompilationTask。这是我让它工作的方法:

String classPath = "webapps/WEB-INF/lib/jar1.jar;webapps/WEB-INF/lib/jar2.jar";
List<String> options = new ArrayList<String>();
options.addAll(Arrays.asList("-classpath", classPath));
final JavaCompiler.CompilationTask task = compiler.getTask(null, manager, null, options, null, Arrays.asList(source));

0
投票

虽然@Jared 的解决方案引导我走向正确的方向,但我需要进行一些调整才能使其正常工作:

  1. 指定完整路径,在我的例子中:
    /opt/tomcat/webapps/ROOT/lib/<libname>.jar
  2. 使用
    :
    而不是
    ;
    作为分隔符来分隔路径。
  3. 添加到原来的默认类路径而不是替换它。因此,只需将
    System.getProperty("java.class.path")
    (用
    :
    分隔)添加到字符串中即可。
© www.soinside.com 2019 - 2024. All rights reserved.