Компиляция классов во время выполнения с помощью приложения весенней загрузки - PullRequest
0 голосов
/ 19 января 2019

У меня есть два отдельных проекта:

  • 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 ??

С уважением.

...