我有两个gradle项目:
API Rest项目公开一个POST
端点,该端点对某些Java代码进行运行时编译。
此Java代码扩展了一个其父级在业务项目中定义的类。
通过https://github.com/trung/InMemoryJavaCompiler上的InMemoryJavaCompiler
完成代码编译。
取决于应用程序的启动方式,出现两种情况:
在启动和调试API Rest时,使用 IntelliJ
正常工作。该代码已编译并可以执行。
使用 java -jar
启动和调试API Rest 无效。该jar与bootJar
任务一起打包。 Java可执行文件来自JDK
不能完全正常工作意味着InMemoryJavaCompiler
类加载器在运行时无法看到业务项目中定义的类,因此编译失败。
示例堆栈跟踪
2019-01-19 10:33:50.955 ERROR 1636 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mdkt.compiler.CompilationException: Unable to compile the source
[kind=ERROR, line=1, message=package com.foo.entities does not exist]
[kind=ERROR, line=1, message=cannot find symbol
symbol: class BaseClass]
[kind=ERROR, line=1, message=cannot find symbol
symbol: class Entity
location: class com.foo.myClass]
[kind=ERROR, line=1, message=method does not override or implement a method from a supertype]] with root cause
org.mdkt.compiler.CompilationException: Unable to compile the source
[kind=ERROR, line=1, message=package package com.foo.entities does not exist]
[kind=ERROR, line=1, message=cannot find symbol
symbol: class BaseClass]
[kind=ERROR, line=1, message=cannot find symbol
symbol: class Entity
location: class com.foo.myClass]
[kind=ERROR, line=1, message=method does not override or implement a method from a supertype]
at org.mdkt.compiler.InMemoryJavaCompiler.compileAll(InMemoryJavaCompiler.java:106) ~[InMemoryJavaCompiler-1.3.0.jar!/:na]
at org.mdkt.compiler.InMemoryJavaCompiler.compile(InMemoryJavaCompiler.java:126) ~[InMemoryJavaCompiler-1.3.0.jar!/:na]
Spring Boot版本是2.1.2
,而Java是版本8
我要编译的代码是一行,但是这里经过格式化以提高可读性
package com.foo;
import com.foo.entities.Entity;
public class myClass extends BaseClass {
@Override public void evaluate(Entity entity) {
System.out.println(entity);
}
}
当以jar
打包和分发时,如何使该API Rest正常工作?
亲切的问候。