我有一个现有的“示例 Webapp”,它使用 Maven 引用“示例库”。我在 Eclipse 4.3RC3 中使用 m2e 插件运行 Tomcat 7。当我在 Eclipse 内的 Tomcat 上启动 Example Webapp 时,我已经验证它example-library.jar
可能已部署在 Tomcat 实例的WEB-INF/lib
文件夹中。
示例 Webapp 具有使用JavaCompiler.CompilationTask
. 这些动态生成的类引用example-library.jar
. 不幸的是,编译任务失败,因为找不到引用的类。
我知道我可以设置JavaCompiler
classpath,但System.getProperty("java.class.path")
只返回 Tomcat 类路径,而不是 webapp 类路径:
C:\bin\tomcat\bin\bootstrap.jar;C:\bin\tomcat\bin\tomcat-juli.jar;C:\bin\jdk6\lib\tools.jar
其他人说我需要WEB-INF/lib
从 servlet 上下文中获取真正的路径,但是类生成代码对 servlet 上下文一无所知 --- 它被编写为不知道它是在客户端还是在客户端上使用服务器。
在另一个问题中,一个答案表明我可以枚举类加载器 URL,果然这为我提供了 jars WEB-INF/lib
,但是当我将其作为-classpath
选项提供时compiler.getTask()
,任务仍然失败,因为它找不到引用的类。
如何简单地将当前执行代码的类路径提供给JavaCompiler
实例,以便它从库中找到类WEB-INF/lib
?(提出了一个类似的问题,但从未回答有关使用 .ear 文件中引用 jar 的问题JavaCompiler
。)
示例:为了不惜一切代价让事情正常进行,我什至尝试对类路径进行硬编码。例如,我foobar.lib
在我的 webapp lib 目录中有,所以我使用了以下代码,根据我上面指出的答案修改:
List<String> options = new ArrayList<String>();
options.add("-classpath");
options.add("C:\\work\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\wtpwebapps\\FooBar\\WEB-INF\\lib\\foobar.jar");
JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, options, null, compilationUnits);
boolean success = task.call();
最后success
是false
,我diaognostics
表示package com.example.foo.bar does not exist...
,即使那个包在foobar.jar
.