У меня есть два отдельных проекта:
- Java-проект, который определяет некоторые бизнес-объекты.
- Java-проект Spring Boot API Rest, зависящий от первого проекта
Проект API Rest предоставляет конечную точку POST
, которая выполняет компиляцию некоторого кода Java во время выполнения.
Этот код Java расширяет класс, родительский элемент которого определен в бизнес-проекте.
Компиляция кода выполняется с помощью InMemoryJavaCompiler
в https://github.com/trung/InMemoryJavaCompiler.
В зависимости от того, какПри запуске приложения возникают два случая:
При запуске и отладке API Rest с IntelliJ
отлично работает .Код скомпилирован и может быть выполнен.
При запуске и отладке API Rest с java -jar
он не работает .Баночка упакована с задачей bootJar
.Java executble взят из 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);
}
}
Как я могу заставить этот API Rest работать, когда упакован и распространяется как jar
??
С уважением.