Java의 internal을 통해 하위 프로세스에서 다른 클래스를 시작하는 응용 프로그램이 java.lang.ProcessHandler
있습니다. 아주 간단합니다.
public MySubProcessHandler() {
// setup commands
String javaHome = System.getProperty(ProcessKeys.JAVA_HOME);
String javaBin = Paths.get(javaHome, "bin", "java").toString();
String classpath = System.getProperty(ProcessKeys.JAVA_CLASSPATH);
String className = MyServer.class.getName();
List<String> command = new LinkedList<>();
command.add(javaBin);
command.add("-classpath");
command.add(classpath);
command.add(className);
// setup sub process
ProcessBuilder processBuilder = new ProcessBuilder(command);
processBuilder.start();
}
이제 모든 것이이 응용 프로그램과 IntelliJ에서 잘 작동합니다. 그러나 Spring-Boot 응용 프로그램에서도 이것을 사용합니다. 실행 가능한 JAR을 시작하고 하위 프로세스를 만들고 싶을 때 해당 하위 프로세스의 오류 스트림이 저에게 보냅니다.
Error: Could not find or load main class my.path.to.MyServer
Caused by: java.lang.ClassNotFoundException: my.path.to.MyServer
Spring 애플리케이션에서 실행 가능한 jar를 확인할 때 실제로 내부 프로젝트 클래스로만 구성되지만 의존성은 없습니다. 의존성은BOOT-INF/lib/my-server.jar
질문 : Spring이이 클래스를로드 MySubProcessHandler
하여 찾을 수 있도록하려면 어떻게해야합니까?
My Current Approaches : 첫째, Spring이 클래스를로드하도록 강제하기 위해 설정 MyServer
을 통해 이것을 해킹 할 수 있다고 생각했습니다 @Bean
. 불행히도 작동하지 않는 것 같습니다. IntelliJ가 응용 프로그램을 시작할 때 클래스 경로에 종속 메이븐 리포지토리를 자동으로 추가하고 문제가 해결된다는 것을 알았습니다! 따라서 IntelliJ에서는 잘 작동합니다. 그러나 필요한 jar ( "누락 된"클래스 포함)가 이미 fat jar에 있다는 점을 고려하면 시작시 maven 의존성을 클래스 경로에 수동으로 추가하는 것은 잘못된 것 같습니다. 이것에 대한 또 다른 해결책이 있어야합니다.