2010-02-03 6 views
0

특정 패키지 수에서 다양한 Java 클래스로 구성된 Java로 응용 프로그램을 컴파일하려고합니다. 명령 줄에서, 나는 루트 패키지와 유형이 포함 된 폴더로 변경할 수 있습니다임의의 하위 폴더에 저장된 패키지에서 프로그래밍 방식으로 Java 클래스 컴파일

javac rootpackage/subpackage/*.java 

또는

javac rootpackage/*/*.java 

내 rootpackage의 모든 주요 하위 패키지에있는 모든 자바 클래스를 컴파일 할 수 있습니다.

그러나 Java 응용 프로그램 내에서이 작업을 수행하고 싶습니다. (우리는 단위 테스트를 포함하는 학생들에게 어플리케이션을 제공하고, 유닛 테스트는 코드에 대해 실행해야하며, 테스트 결과를 '워터 마크 처리'된 소스 파일을 포함하는 JAR 파일을 만듭니다. 이 작업은 정상적으로 진행되지만 테스트 된 클래스 파일은 제출 된 소스 파일에서 생성되므로 프로그래밍 방식으로 Java 소스를 컴파일하는 것이 좋습니다.

각 학생이 루트 패키지를 임의의 위치에 저장한다는 점에서 문제가 있습니다. 파일 위치를 JavaCompiler (javax.tools)로 전달할 수없는 것 같습니다.

그렇다면 임의로 배치 된 루트 패키지를 올바르게 컴파일하는 방법에 대한 힌트를 줄 수 있습니까?

건배

리처드

추가 정보

:

학생이 폴더 구조를 가지고 :

루트 패키지가 포함
/home/student/work/java/myproject/ 

. 그들은 응용 프로그램을 시작합니다 (아마도이 ​​폴더에 저장되어 있으므로 문제가되지 않지만 다른 곳에 저장되어있을 가능성이 높습니다). 루트 패키지가 들어있는 폴더를 묻습니다. 입력 후 학생들은 패키지에있는 파일을 컴파일하는 JAR 생성 버튼을 클릭하고 새로 컴파일 된 파일에 대한 테스트를 실행 한 다음 JAR을 작성합니다.

이 문제를 생각하면서 해결책은 학생들에게 루트 패키지가 들어있는 폴더에 'create JAR'응용 프로그램을 설치하도록 할 수 있습니다.

package com.blah.blah.assignment;

즉, 패키지 이름의 시작을 찾아 다음부터 검색 경로의 첫 번째 디렉토리를 찾습니다

+0

학생들이 자신의 jar'ing을 수행하지 못하게 할 수 있습니까? ... 그러면 도구는 항아리를 업로드하는 곳이되어 테스트를 실행하여 jar 도구를 만드는 데 어려움을 겪습니다. jar를 사용하는 방법에 대해 교육합니다 (상당히 중요하다고 생각합니다). –

+0

또는 GUI에서 일종의 GUI가 붙어있는 것처럼 들리므로 JFileDialog를 사용하여 소스 경로를 선택할 수 있습니다. –

답변

0

당신은 라인 시작에 대한 각각 된 .java 파일의 맨 위에 들여다 수 com (이 예제에서)을 실행 한 다음 JavaCompiler 객체에이 경로를 지정하거나 질문을 오해 한 적이 있습니까?

javax.tools 패키지를 살펴본 결과, getFileForInput 또는 getJavaFileForInput과 같은 메소드에 대한 모든 요청을 학생 소스의 적절한 시작 디렉토리로 전달할 ForwardingjavaFileManager를 래핑하는 javaFileManager에 대한 복합 래퍼를 생성하는 것이 좋습니다. 디렉토리 (첫 번째 .java 파일을 파싱하여 소스 경로의 루트를 결정한 예비 비트로 결정)

0

JavaCompiler.getTask()의 ​​마지막 인수는 반복 가능 <입니까?컴파일 단위가 포함 된 JavaFileObject >을 확장하여 컴파일러에 전달합니다. JavaFileObject의 제공된 구현 중 하나는 SimpleFileJavaObject (http://java.sun.com/javase/6/docs/api/javax/tools/SimpleJavaFileObject.html)입니다. 이것은 File 객체에서 쉽게 생성 할 수있는 java.net.URI 객체로 구성됩니다. 모두 함께 퍼팅, 같은 것을 할 : rootPackageDirFromUser 그들이 파일을 저장을 알려줍니다 사용자에 의해 주어지고, fileNameInRootDir 그 디렉토리에있는 자바 소스 파일의 이름입니다

List<JavaFileObject> javaFiles = new ArrayList<JavaFileObject>(); 
File javaFile = new File(rootPackageDirFromUser, fileNameInRootDir); 
URI javaURI = javaFile.toURI(); 
javaFiles.add(new SimpleJavaFileObject(javaURI, JavaFileObject.Kind.SOURCE)); 
JavaCompiler.CompilationTask task = 
    ToolProvider.getSystemJavaCompiler().getTask(..., javaFiles); 

. 미리 파일 이름을 모르는 경우에는 rootPackageDirFromUser를 반복하여 목록을 만들어야합니다.

아직 테스트하지는 않았지만 일반적인 아이디어가 필요합니다.

관련 문제