2011-11-30 3 views
1

java 프로젝트 내부에서 외부 Java 프로젝트 (클래스)를 실행하고 싶습니다. 나는 어떤 프로그램 (예 : EXE 파일)이 아니라 자바 클래스 (프로젝트)를 의미합니다.외부 Java 클래스 (프로젝트) 실행

하자 당신은 문자열의 클래스 파일 경로가 고려 :

String = "C:\\test\\test.class"; 

답변

0

다른 자바 프로그램이 메인 메소드의 호출에 의해 수행되는 "실행"을 참조하십시오. 당신은 당신이 실행하려는 클래스 net.tilialacus.TheProg가 있다고 클래스가 컴파일 타임에 알려져 있지 않은 경우, 당신은

String[] args = {"arg1", "arg2"}; 
net.tilialacus.TheProg.main(args); 

또는 반사를 통해 (다른 자바 프로그램에서) 수행 할 수 있습니다

Class<?> theClass = Class.forName("net.tilialacus.TheProg"); 
    Method method = theClass.getDeclaredMethod("main", String[].class); 
    String[] args = { "arg1", "arg2"}; 
    method.invoke(null, (Object)args); 

물론 클래스가 없거나 "public static main (String [])"메서드가없는 경우 예외를 처리해야합니다.

+0

Lindsjo하자 내가 프로젝트 예 1 및 주요 클래스 예 1이 말 : 당신이/사용을 인스턴스화 할 디스크에 외부 .class 파일이있는 경우 사용 가능한 API를 알고 나면, 다음은 비교적 간단합니다. 수업. Java 프로그램에서 어떻게 빌드하고 실행할 수 있습니까? 의견이 있으십니까? – 100798

+0

@ 100798 클래스가 이미 클래스 경로에 있습니까? 제가 위에 보여준 것을 사용할 수 있어야합니다. 그렇지 않다면 클래스 로더를 통해로드해야합니다 (craig의 답변 참조). 어떤 부분에 문제가 있습니까? –

2

아주 드문 음색 외에도 마치 플러그인 구조의 일종을 원하는 것처럼 보입니다.

기본적으로 원하는 클래스/라이브러리를로드하는 ClassLoader이 필요합니다. 로드가 완료되면 사용할 수 있습니다.

은 어쩌면이 당신을 도와줍니다 : How to load a jar file at runtime

4

이것은 ClassLoader의 책임입니다.

File f = ...; // Folder containing the .class files 

ClassLoader loader = new URLClassLoader(new URL[] { f.toURI().toURL() }, getClass().getClassLoader();); 
for (File classFile : f.listFiles(new FilenameFilter() { 
    public boolean accept(File dir, String name) { 
     return name.endsWith(".class"); 
    } 
})) { 
    try { 
     String filename = classFile.getName(); 
     // Remove the .class extension 
     Class<?> cls = loader.loadClass(filename.substring(0, filename.length() - 6)); 
     // Do something with the class 
    } catch (Exception ex) { 
     LOGGER.error("Unable to load plugin: " + ex.getMessage()); 
    } 
} 
+0

예를 들어 좀 더 일반적인 경우 인 것 같습니다. 가장 단순한 예제를 생각해 봅시다. 여기에서는 클래스 파일 경로가 String = "C : \\ .. \\ test.class"문자열에 있다고 가정합니다. 이제 어떻게 실행 (로드)하는지. – 100798

+0

... 코드를 읽었습니까? 첫 번째 줄은 말 그대로 원하는대로 작동하도록 작성해야하는 유일한 것입니다. 문제가있는 부분이 있습니까? 특정 파일을로드하기를 원할 경우 (한 줄만 변경하려는 경우) "test.class"의 경우에만 true를 반환하도록 FilenameFilter를 변경할 수 있습니다. –

+0

예, 작동하지 않습니다. 파일 이름은 폴더의 모든 클래스를 문자열에 보관합니다. 하나의 .class 파일이 있어도 아무 일도하지 않습니다. 해당 클래스가로드되지 않습니다. 전의. 그 폴더에 간단한 GUI 프로그램이 있지만로드되지 않습니다. 더 이상 오류가 나타나지 않습니다. – 100798

관련 문제