2017-09-07 5 views
0

이 문제와 관련된 모든 게시물을 읽었으므로 아무런 해결책이 없지만 항상 null이됩니다.

JRE를 사용하고 lib 디렉토리에 tools.jar를 넣고 빌드 경로에 추가했지만 Eclipse로 건너 뛰고 싶을 때 rt.jar (?) 내가 전혀하지 않는 것 알다.
그 이유가 내가 null이 될 수 있습니까? 어떻게 올바르게 구성 할 수 있습니까?

null을 반환하는 getSystemJavaCompiler()의 기준은 무엇입니까?ToolProvider.getSystemJavaCompiler()는 항상 jdk를 사용하여 null을 반환합니다.

Preferences screenshot

+0

의 rt.jar 자바의 기본 내용을 많이 포함되어 있습니다. – Nathan

+1

[Java 컴파일러 API를 사용하는 동안 [null 포인터 예외]의 가능한 복제본 (https://stackoverflow.com/questions/2543439/null-pointer-exception-while-using-java-compiler-api) – Joe

+0

나는 그 rt.jar을 알고있다. 사전 컴파일 된 Java 클래스를 포함하지만 jdk의 내용을 포함해서는 안됩니다. rt.jar의 클래스가 작동하지 않는 클래스 만 null을 반환합니까? – Tokra

답변

1

은 JRE는 자바 런타임 환경입니다. 컴파일러가 없으므로 null이됩니다. 본격적인 JDK를 사용하면 null이 아닌 결과를 얻게됩니다.

+0

안녕하세요, 답변 덕분에. 불행히도 jdk 대신 jre를 사용하는 선택의 여지가 없습니다. 하지만 나는 ** tools.jar **을 ** lib 경로 **에서 복사하거나 JRE 설치의 lib 경로에서 다른 컴파일러를 복사 할 때 컴파일러를 사용할 수 있음을 읽었습니다. 전략 패턴을보다 역동적으로 만들려면이 기능이 필요합니다. 데이터베이스의 새로운 항목으로 애플리케이션을 확장 할 수 있습니다. – Tokra

+0

나는 jdk와 함께 그것을 시도했다 - 어떤 성공도없이. 결과는 같습니다. – Tokra

0


문제점에 대한 해결책을 찾았습니다. 처음에는 jre를 다시 사용했습니다. tools.jar을 응용 프로그램의 lib 디렉토리에 넣습니다.
ToolProvider.getSystemJavaCompiler() return null.
이렇게하여 JavaCompiler를 얻을 수있는 해결 방법은 다음과 같습니다

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
if (compiler == null){ 
    try { 
     Class<?> javacTool = Class.forName("com.sun.tools.javac.api.JavacTool"); 
     Method create = javacTool.getMethod("create"); 
     compiler = (JavaCompiler) create.invoke(null); 
    } catch (Exception e) { 
     throw new AssertionError(e); 
    }