【发布时间】:2013-06-02 20:36:17
【问题描述】:
我有一个使用 Maven 引用“示例库”的现有“示例 Web 应用程序”。我正在使用 m2e 插件在 Eclipse 4.3RC3 中运行 Tomcat 7。当我在 Eclipse 内的 Tomcat 上启动 Example Webapp 时,我已验证 example-library.jar 可能已部署在 Tomcat 实例的 WEB-INF/lib 文件夹中。
示例 Web 应用程序的代码使用 JavaCompiler.CompilationTask 即时编译某些类。这些动态生成的类引用example-library.jar 中的类。不幸的是,编译任务失败,因为找不到引用的类。
我知道我可以 set the 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
其他有 said 我需要从 servlet 上下文中获取 WEB-INF/lib 的真实路径,但是类生成代码对 servlet 上下文一无所知 --- 它被编写为不知道是否它在客户端或服务器上使用。
在another question 中,一个answer 表示我可以枚举类加载器URL,果然这为我提供了WEB-INF/lib 中的jar,但是当我将其作为-classpath 选项提供给compiler.getTask() 时,该任务仍然失败,因为它找不到引用的类。
如何简单地将当前执行代码的类路径提供给JavaCompiler 实例,以便它可以从WEB-INF/lib 的库中找到类? (提出了一个similar question,但从未回答有关使用JavaCompiler 在ear 文件中引用jar 的问题。)
示例: 为了不惜一切代价让事情顺利进行,我什至尝试对类路径进行硬编码。例如,我的 webapp lib 目录中有foobar.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中。
【问题讨论】:
标签: eclipse maven tomcat classpath java-compiler-api