2011-10-08 4 views
0

패키지 a.b.c에서 Java 클래스를 정의했지만 c : \ 에 컴파일 된 클래스 파일을 넣고 URLClassloader를 사용하여로드하면 오류가 발생합니까?자바 패키지가 런타임 동작에 영향을 줍니까?

편집 -------------------------------------------- 나는 위의 코드를 실행하면 --------------

package amarsoft.rcp.base.util.test; 

import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.Writer; 

import javax.tools.JavaCompiler; 
import javax.tools.ToolProvider; 

public class JavaCompolierDemo { 

    /** 
    * @param args 
    * @throws IOException 
    */ 
    public static void main(String[] args) throws IOException { 
     // TODO Auto-generated method stub 
     String source = " package a.b.c; public class Test { public static void main(String args[]) {  System.out.println(\"hello\"); } }"; 

     // Save source in .java file. 
     File root = new File("C:\\java\\"); 
     root.mkdir(); 
     File sourceFile = new File(root, "\\Test.java"); 
     Writer writer = new FileWriter(sourceFile); 
     writer.write(source); 
     writer.close(); 

     // Compile source file. 
     JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); 
     compiler.run(null, null, null, sourceFile.getPath()); 
    } 

} 

, 정의 된 패키지 ABC 디렉토리 \ B 형 \의 C로 생성되지는 Test.class라는이 될 것입니다 in c : \ Test.class

+0

질문하시는 질문의 예를 제공해 주시겠습니까? – monksy

답변

0

a.b.c을로드하려고하면 파일 c에 대해 디렉토리 a/b이 표시되므로 파일이 없으면 찾을 수 없습니다.

URLClassLoader를 변경하여 다른 디렉토리에서 파일을 찾으면 오류없이 클래스를로드 할 수 있습니다.

무엇을하려하십니까?

EDIT : 몇 년 전에 작성한 작은 컴파일러 라이브러리의 예입니다. 메모리의 String에서 소스를 가져와 컴파일 된 외부 클래스를 제공합니다.

http://essence.svn.sourceforge.net/viewvc/essence/trunk/essence-file/src/test/java/org/freshvanilla/compile/CompilerTest.java?revision=293&view=markup

이이 작업을 수행하기 위해 컴파일러 API를 사용합니다. 코드를 디버그하려면 지정한 디렉토리에 코드를 작성합니다 (생성 된 코드를 단계별로 실행할 수 있습니다). 그렇지 않으면 메모리에서 완전히 작동합니다.

+0

JavaCompiler를 사용하여 런타임에 Java 소스 코드 컴파일을 지원하려고합니다. – CaiNiaoCoder

+0

이 API에서는 파일을로드 할 위치를 결정합니다. 표준 위치에서 파일을로드하는 것은 가장 단순 할 것 같지만 메모리에서라도 어디에서나로드 할 수 있습니다. –

1

짧은 :

긴 :. 당신은 정말 당신이 묻는대로 그렇지 않으면 오류를 줄 것이다 (b를 포함) 폴더 a
가에있는 폴더로 작업 디렉토리를 설정해야합니다. 당신의 편집 후


내 편집 :
당신은 물론 폴더를 생성하여, 패키지를 직접 작성해야합니다. 그리고 컴파일 할 소스 파일을 패키지에 넣으십시오.

File sourceFile = new File(root, "a\\b\\c\\Test.java"); 
sourceFile.getParent().mkdirs(); 
FileWriter fw = new FileWriter(sourceFile); 
fw.write(source); 
fw.flush(); 
fw.close(); 

.... 

올바른 패키지에 포함되지 않은 Java 소스 코드를 컴파일하려고하면 컴파일되지 않으며 컴파일 오류가 발생합니다. 이런 식으로 소스 코드를 컴파일 한 적이 없다는 것을 인정해야합니다.

+0

"직접 패키지를 만드십시오",하지만 그럴 필요는 없습니다. 그렇지 않습니까? – CaiNiaoCoder

+0

필요합니다. 그러나 나는 이런 식으로 소스 코드를 컴파일하지 않았다 ... 그래서 아마도 다른 규칙이있다. –

관련 문제