4

実行時に生成され、を使用してコンパイルされる 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>
4

2 に答える 2

1

Loaderを使用して reloadable を true に設定できます (これも関連している可能性があります) 。

于 2012-09-19T12:12:51.627 に答える
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));
于 2012-09-20T14:51:44.230 に答える