我有一個使用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
我已經嘗試過了,並且不起作用。我已經更新了這個問題,以包含我嘗試過的一個例子。也許你可以指出我做錯了什麼。 –