2010-02-03 2 views
0

Я ищу компиляцию приложения на Java, состоящего из различного количества классов Java в определенном количестве пакетов. В командной строке можно изменить к папке, содержащей пакет корневой системы и типа:Программно скомпилировать Java-класс в пакете, хранящемся в произвольной подпапке

javac rootpackage/subpackage/*.java 

или

javac rootpackage/*/*.java 

собрать все классы Java во всех первичных подпакетах моего rootpackage.

Однако я хотел бы иметь возможность сделать это в приложении Java. (Идея состоит в том, что мы предоставляем приложение для студентов, которое содержит модульные тесты. Модульные тесты должны выполняться против их кода, тогда приложение создает файл JAR, содержащий исходные файлы, которые были «отмечены знаком» с результатами теста. это работает нормально, но мы хотели бы удостовериться, что проверенные файлы классов созданы из исходных файлов, представленных, следовательно, идея программно скомпилировать источники java).

Проблема заключается в том, что каждый ученик хранит свой корневой пакет в произвольной позиции, и я не могу передать местоположение файла в JavaCompiler (javax.tools).

Возможно ли, и если да, может кто-нибудь дать некоторые подсказки о том, как правильно сформировать корневой пакет с произвольным размещением.

Приветствия

Richard

Дополнительная информация:

студент имеет структуру папок:

/home/student/work/java/myproject/ 

, который содержит корневой пакет. Они запускают приложение (возможно, хранятся в этой папке - и, следовательно, никаких проблем - как бы более вероятно, они не сохранены в другом месте), которые запрашивают у них папку, содержащую корневой пакет. После входа ученики нажимают кнопку создания JAR, которая компилирует файлы в своих пакетах, запускает тесты для вновь скомпилированных файлов, а затем создает JAR.

Хотя, рассматривая эту проблему, возможно, что решение состоит в том, чтобы сообщить учащимся установить наше приложение «создать JAR» в папке, содержащей их корневой пакет.

+0

Не могли бы вы заставить учеников сделать свой собственный jar'ing? ... Ваш инструмент мог бы стать чем-то, где они загружают свою банку, и она проводит свои тесты, что избавляет вас от головной боли при создании инструмента для банок и воспитывает их в том, как использовать банку (что, по моему мнению, очень важно) –

+0

В качестве альтернативы, похоже, что у вашего инструмента есть какой-то графический интерфейс, поэтому вы можете просто дать им JFileDialog, чтобы выбрать путь к исходному файлу. –

ответ

0

Не могли бы вы заглянуть в верхней части каждого файла .java для начала строки:

package com.blah.blah.assignment;

т.е. искать начало имени пакета, а затем искать в первый каталог в пути поиска начала com (в этом примере), а затем передать этот путь объекту JavaCompiler или я неправильно понял ваш вопрос?

Только что посмотрел на пакет javax.tools, почему бы не создать составную оболочку для javaFilemanager, которая обертывает ForwardingjavaFileManager, который будет перенаправлять все запросы для таких методов, как getFileForInput или getJavaFileForInput, в соответствующий стартовый каталог в источнике ученика (как решил ваш предварительный бит разбора первого файла .java, чтобы определить корень их исходного пути)

0

Последний аргумент JavaCompiler.getTask() - это Iterable <?расширяет JavaFileObject >, содержащий единицы компиляции для передачи компилятору. Одной из предоставленных реализаций JavaFileObject является SimpleFileJavaObject (http://java.sun.com/javase/6/docs/api/javax/tools/SimpleJavaFileObject.html). Он построен с объектом java.net.URI, который может быть легко создан из объекта File. Собираем все вместе, сделать что-то вроде этого:

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 задается пользователем, который говорит вам, где они хранятся файлы, и fileNameInRootDir это имя исходного файла Java в этой директории. Если вы заранее не знаете имена файлов, вам необходимо выполнить итерацию по корневому каталогу для создания списка.

Я не проверял это, но это должно дать вам общую идею.

Смежные вопросы