我有一个使用Maven引用“Example Library”的现有“示例Webapp”。我使用m2e插件在Eclipse 4.3RC3内部运行Tomcat 7。当我在Eclipse内部的Tomcat上启动示例Webapp时,我已验证example-library.jar
可能正在部署在Tomcat实例的WEB-INF/lib
文件夹中。在Maven中使用Tomcat中的Tomcat中的JavaCompiler使用webapp classpath
示例Web应用程序具有使用JavaCompiler.CompilationTask
即时编译某些类的代码。这些动态生成的类引用example-library.jar
中的类。不幸的是编译任务失败,因为无法找到引用的类。
我知道我可以set the JavaCompiler
classpath,但System.getProperty("java.class.path")
只返回我Tomcat的类路径,而不是Web应用程序类路径:
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表示我可以列举的类加载器的网址,果然这为我提供了的罐子在WEB-INF/lib
,但是当我提供这作为-classpath
选项compiler.getTask()
,任务仍然失败,因为它不能找到引用的类。
如何简单地将当前正在执行的代码的类路径提供给JavaCompiler
实例,以便它可以从WEB-INF/lib
的库中找到类? (A similar question升高而对于使用JavaCompiler
引用耳朵文件中的罐子根本没有回答。)
例子:在试图得到的东西,不惜任何代价的工作,我甚至尝试硬编码的类路径。例如,我在我的web应用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
。
您是否仔细阅读过我的问题以及我提供的链接?你的答案与我已经尝试的方法有什么不同,而且提供了实际的代码? –
是的,我的确看过你的问题。您提供了一个指向stackoverflow答案的链接,向您展示了如何设置JavaCompiler -classpath,然后您问“如何简单地向JavaCompiler提供当前正在执行的代码的类路径”。现在只需创建classpath字符串(例如/path/to/webapp/WEB-INF/lib/example-library.jar)并将其传递给javaCompiler。您的组件无需了解有关Servlet上下文或类加载器URL的任何信息。 – Jukka
我已经尝试过了,并且不起作用。我已经更新了这个问题,以包含我尝试过的一个例子。也许你可以指出我做错了什么。 –