我正在开发一个web应用程序,我可以导入Java代码,编译,然后执行它。这个类可能有从其他图书馆,我加入到我的类路径一些进口。运行它作为一个桌面应用程序,它的工作原理,但在wildfly运行9.0.2没有找到我的类路径库等等,我有错误编译我的代码。
我一定要改变wildfly配置任何设置?我想我的代码使用和不使用Maven的。
我使用这个库编译我的代码,就像我说的,它使用像桌面应用程序的工作:qazxsw POI
错误:
https://github.com/trung/InMemoryJavaCompiler
错误消息继续与所有其他的导入库,然后将classformaterror:
13:44:57,686 ERROR [stderr] (default task-5) /br/com/project/webtest/service/CompileClass.java:2: error: package org.junit does not exist
13:44:57,686 ERROR [stderr] (default task-5) import static org.junit.Assert.*;
13:44:57,686 ERROR [stderr] (default task-5) ^
13:44:57,687 ERROR [stderr] (default task-5) /br/com/project/webtest/service/CompileClass.java:3: error: cannot find symbol
13:44:57,687 ERROR [stderr] (default task-5) import br.com.project.webtest.service.SeleniumService;
13:44:57,688 ERROR [stderr] (default task-5) ^
13:44:57,688 ERROR [stderr] (default task-5) symbol: class SeleniumService
13:44:57,688 ERROR [stderr] (default task-5) location: package br.com.project.webtest.service
13:44:57,689 ERROR [stderr] (default task-5) /br/com/project/webtest/service/CompileClass.java:4: error: package org.junit does not exist
13:44:57,689 ERROR [stderr] (default task-5) import org.junit.*;
编辑:我添加使用eclipse火星,在WebContent / WEB-INF / lib文件夹下,加入我的库,然后右键单击,添加到构建路径。
编辑2:类负责创建的代码,并得到结果:
13:44:57,751 WARNING [javax.enterprise.resource.webcontainer.jsf.lifecycle] (default task-5) #{testController.action()}: java.lang.ClassFormatError: Truncated class file: javax.faces.FacesException: #{testController.action()}: java.lang.ClassFormatError: Truncated class file
我创建了扩展lib和改变使用父类加载器的类:
package br.com.test;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@ManagedBean
@SessionScoped
public class TestController {
public void actionParent() {
String javaCode = generateJavaCode();
Class<?> compile = null;
try {
compile = InMemoryCompilerTest.compile(Thread.currentThread().getContextClassLoader(),
"br.com.project.webtest.service.CompileClass", javaCode);
System.out.println("Worked: " + compile);
} catch (Exception e) {
e.printStackTrace();
}
}
public void actionClassLoader() {
String javaCode = generateJavaCode();
Class<?> compile = null;
try {
compile = InMemoryCompilerTest.compile("br.com.project.webtest.service.CompileClass", javaCode);
System.out.println("Worked: " + compile);
} catch (Exception e) {
e.printStackTrace();
}
}
static String readFile(String path, Charset encoding) throws IOException {
byte[] encoded = Files.readAllBytes(Paths.get(path));
return new String(encoded, encoding);
}
private static String generateJavaCode() {
String java = "package br.com.project.webtest.service;\r\n"
+ "import static org.junit.Assert.*;\r\n"
+ "public class CompileClass {\r\n"
+ " public CompileClass() {\r\n"
+ " System.out.println(\"Dynamically compiled\");\r\n"
+ " String text = \"Testing JUnit lib\";\r\n"
+ " assertEquals(\"Testing JUnit lib\", text);\r\n"
+ " System.out.println(\"completed\");\r\n"
+ " }\r\n" + " public static void main(String[] args) {\r\n"
+ " new CompileClass();\r\n"
+ " System.out.println(\"finish\");\r\n"
+ " }\r\n"
+ "}\r\n";
return java;
}
public static void main(String[] args) {
TestController c = new TestController();
c.actionClassLoader();
c.actionParent();
}
}
XHTML:
public class InMemoryCompilerTest extends InMemoryJavaCompiler {
static JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
public static Class<?> compile(ClassLoader parent, String className, String sourceCodeInText) throws Exception {
SourceCode sourceCode = new SourceCode(className, sourceCodeInText);
CompiledCode compiledCode = new CompiledCode(className);
Iterable<? extends JavaFileObject> compilationUnits = Arrays.asList(sourceCode);
DynamicClassLoader cl = new DynamicClassLoader(parent);
ExtendedStandardJavaFileManager fileManager = new ExtendedStandardTest(
javac.getStandardFileManager(null, null, null), compiledCode, cl);
JavaCompiler.CompilationTask task = javac.getTask(null, fileManager, null, null, null, compilationUnits);
boolean result = task.call();
return cl.loadClass(className);
}
}
public class ExtendedStandardTest extends ExtendedStandardJavaFileManager{
protected ExtendedStandardTest(JavaFileManager fileManager, CompiledCode compiledCode, DynamicClassLoader cl) {
super(fileManager, compiledCode, cl);
}
}
我测试如你所说,但也没有工作,通过父类加载器。
第一类“的TestController”从它的工作原理主要方法执行。
编辑:
我已经添加了下面的代码,我可以设定我的库类路径:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html">
<h:head></h:head>
<h:body>
<h:form>
<h:commandButton action="#{testController.actionClassLoader()}" value="ClassLoader" />
<h:commandButton action="#{testController.actionParent()}" value="Parent" />
</h:form>
</h:body>
</html>
执行,因为它返回一个Java应用程序:
// set the classpath
List<String> options = new ArrayList<String>();
options.add("-classpath");
StringBuilder sb = new StringBuilder();
URLClassLoader urlClassLoader = (URLClassLoader) parent;
for (URL url : urlClassLoader.getURLs()) {
sb.append(url.getFile()).append(File.pathSeparator);
}
options.add(sb.toString());
执行为Web应用程序:
[-classpath, /C:/Users/dev/Automacao/workspace/test/build/classes/;/C:/Users/dev/Automacao/workspace/test/WebContent/WEB-INF/lib/InMemoryJavaCompiler-1.2.jar;/C:/Users/dev/Automacao/workspace/test/WebContent/WEB-INF/lib/commons-io-2.5.jar;/C:/Users/dev/Automacao/workspace/test/WebContent/WEB-INF/lib/workspace_libs/client-combined-3.0.0-beta3-nodeps.jar;/C:/Users/dev/Automacao/workspace/test/WebContent/WEB-INF/lib/workspace_libs/commons-codec-1.10.jar;/C:/Users/dev/Automacao/workspace/test/WebContent/WEB-INF/lib/workspace_libs/commons-exec-1.3.jar;/C:/Users/dev/Automacao/workspace/test/WebContent/WEB-INF/lib/workspace_libs/commons-logging-1.2.jar;/C:/Users/dev/Automacao/workspace/test/WebContent/WEB-INF/lib/workspace_libs/gson-2.3.1.jar;/C:/Users/dev/Automacao/workspace/test/WebContent/WEB-INF/lib/workspace_libs/guava-19.0.jar;/C:/Users/dev/Automacao/workspace/test/WebContent/WEB-INF/lib/workspace_libs/hamcrest-core-1.3.jar;/C:/Users/dev/Automacao/workspace/test/WebContent/WEB-INF/lib/workspace_libs/hamcrest-library-1.3.jar;/C:/Users/dev/Automacao/workspace/test/WebContent/WEB-INF/lib/workspace_libs/httpclient-4.5.2.jar;/C:/Users/dev/Automacao/workspace/test/WebContent/WEB-INF/lib/workspace_libs/httpcore-4.4.4.jar;/C:/Users/dev/Automacao/workspace/test/WebContent/WEB-INF/lib/workspace_libs/httpmime-4.5.2.jar;/C:/Users/dev/Automacao/workspace/test/WebContent/WEB-INF/lib/workspace_libs/jna-4.1.0.jar;/C:/Users/dev/Automacao/workspace/test/WebContent/WEB-INF/lib/workspace_libs/jna-platform-4.1.0.jar;/C:/Users/dev/Automacao/workspace/test/WebContent/WEB-INF/lib/workspace_libs/junit-4.12.jar;/C:/Users/dev/Automacao/workspace/test/WebContent/WEB-INF/lib/workspace_libs/netty-3.5.7.Final.jar;/C:/Users/dev/Automacao/workspace/test/WebContent/WEB-INF/lib/workspace_libs/phantomjsdriver-1.3.0.jar;/C:/Users/dev/Automacao/workspace/test/WebContent/WEB-INF/lib/workspace_libs/cglib-nodep-3.2.4.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/annotations-api.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/catalina-ant.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/catalina-ha.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/catalina-storeconfig.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/catalina-tribes.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/catalina.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/ecj-4.3.1.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/el-api.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/jasper-el.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/jasper.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/jsp-api.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/servlet-api.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/tomcat-api.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/tomcat-coyote.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/tomcat-dbcp.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/tomcat-i18n-es.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/tomcat-i18n-fr.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/tomcat-i18n-ja.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/tomcat-jdbc.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/tomcat-jni.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/tomcat-spdy.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/tomcat-util-scan.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/tomcat-util.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/tomcat-websocket.jar;/C:/Program%20Files/Apache%20Software%20Foundation/Apache%20Tomcat%208.0.3/lib/websocket-api.jar;/C:/Users/dev/Automacao/workspace/libraries/JSF%202.2%20(Mojarra%202.2.0)/mojarra-2.2.0-FCS/lib/javax.faces.jar;]
我怎么能得到相同的结果?
搞不定。
我必须作出由@NicolasFilotto提到这种变化,使用Web应用程序时使用的父类加载器。在此之后,对于JavaCompiler进行工作,因为我使用外部库,有必要像我上次编辑提到的通过我的类路径中。基本代码更改为:
[-classpath, /C:/Users/dev/Automacao/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/test/WEB-INF/classes/;/C:/Users/dev/Automacao/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/test/WEB-INF/lib/commons-io-2.5.jar;/C:/Users/dev/Automacao/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/test/WEB-INF/lib/InMemoryJavaCompiler-1.2.jar;/C:/Users/dev/Automacao/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/test/WEB-INF/lib/javax.faces.jar;]
使用wildfly我不得不改变public static Class<?> compile(ClassLoader parent, String className, String sourceCodeInText) throws Exception {
SourceCode sourceCode = new SourceCode(className, sourceCodeInText);
CompiledCode compiledCode = new CompiledCode(className);
Iterable<? extends JavaFileObject> compilationUnits = Arrays.asList(sourceCode);
DynamicClassLoader cl = new DynamicClassLoader(parent);
ExtendedStandardJavaFileManager fileManager = new ExtendedStandard(
javac.getStandardFileManager(null, null, null), compiledCode, cl);
// set the classpath
List<String> options = new ArrayList<String>();
options.add("-classpath");
StringBuilder sb = new StringBuilder();
Enumeration<URL> resources = parent.getResources("/");
while (resources.hasMoreElements()) {
URL url = resources.nextElement();
sb.append(url.getFile()).append(File.pathSeparator);
}
options.add(sb.toString());
// execute the compiler
Boolean call = javac.getTask(null, fileManager, null, options, null, compilationUnits).call();
if (call) {
return cl.loadClass(className);
}
return null;
}
到URLClassLoader urlClassLoader = (URLClassLoader) parent;
@VictorBello我已经实现了Enumeration<URL> resources = parent.getResources("/");
这些功能。即使你可以包括在Dynamic Loader运行时JAR
Dynamic Loader
感谢@胜利者贝洛的理想解决方案。我的解决办法是这样的:
public void DynamicJarCodeTest() throws Exception {
try {
StringBuilder sourceCode = new StringBuilder();
sourceCode.append("package org.dvare.dynamic;\n");
sourceCode.append("import org.apache.commons.math3.Field;\n");
sourceCode.append("public class SourceClass {\n");
sourceCode.append(" public String test() { \n");
sourceCode.append(" return \"inside test method\";\n");
sourceCode.append(" }\n");
sourceCode.append("}");
DynamicCompiler dynamicCompiler = new DynamicCompiler();
dynamicCompiler.setSeparateContext(true);
dynamicCompiler.setUpdateContextClassLoader(false);
dynamicCompiler.addJar(getClass().getClassLoader().getResource("commons-math3.jar"));
dynamicCompiler.addSource("org.dvare.dynamic.SourceClass", sourceCode.toString());
dynamicCompiler.build();
Class aClass = Class.forName("org.apache.commons.math3.Field", false, dynamicCompiler.getClassLoader());
Assert.assertNotNull(aClass);
Class bClass = Class.forName("org.dvare.dynamic.SourceClass", false, dynamicCompiler.getClassLoader());
Assert.assertNotNull(bClass);
} catch (DynamicCompilerException e) {
System.out.println(e.getErrorList());
} catch (Exception e) {
e.printStackTrace();
}
}