Определите выходной путь для динамической компиляции

Моя динамическая компиляция в Java 6 работает отлично. Однако я хотел бы изменить выходной путь. Я попробовал тонны вещей (я сэкономлю Вас), напрасно. Так или иначе вот рабочий код

String[] filesToCompile = { "testFiles/Something.java" };
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjects(filesToCompile);
CompilationTask task = compiler.getTask(null, fileManager, null,null, null, compilationUnits);
System.out.println("Good? " + task.call());

Но вывод переходит к исходному каталогу, который не является тем, что я хочу.

Я подозреваю, что ответ может заключаться в compiler.getTask но API не является очень явным относительно того, что могли бы означать некоторые параметры. Или возможно что-то с fileManager. Я попробовал

fileManager.setLocation(StandardLocation.locationFor("testFiles2"), null);

но снова, предположение является, вероятно, не хорошей идеей.

Спасибо!

Править: Я попытался использовать опции также как это (извините, если существует более компактный путь):

    final List<String> optionsList = new ArrayList<String>();
    optionsList.add("-d what");
    Iterable<String> options = new Iterable<String>() {         
        public Iterator<String> iterator() {
            return optionsList.iterator();
        }
    };

и затем передача опций к getTask, но сообщения об ошибке является "Недопустимым Флагом".

9
задан Dan Rosenstark 8 January 2010 в 15:36
поделиться

1 ответ

У меня есть 0 Опыт работы с инструментами динамического компилятора Java 6. Но никто другой не ответил :)

Задача компиляции получает FileManager объект. Если вы используете стандартный, то классы генерируются в дереве исходного каталога. То, что вы могли бы сделать, это предоставить свой собственный подкласс FileManager с переопределенным методом GetFileForoutput . Описание API GetFileForutput указывает на то, что это будет влиять на то, где пойдем файлы вашего выхода (= класс).

Обновление

Как подключить файловые менеджеры

ForwardingJavileManager, FressingFileObject и FurningJavafileObject Подклассы недоступны для переопределения поведения стандартного файлового менеджера, как оно создано путем вызова метода на компилятере, не вызывая конструктора. Вместо пересылки (или делегация) следует использовать. Эти классы позволяют легко пересылать большинство вызовов на заданный файловый менеджер или объект файла, позволяя настраивать поведение. Например, подумайте, как регистрировать все вызовы в JavafileManager.flush ():

   final Logger logger = ...;
   Iterable<? extends JavaFileObject> compilationUnits = ...;
   JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
   StandardJavaFileManager stdFileManager = compiler.getStandardFileManager(null, null, null);
   JavaFileManager fileManager = new ForwardingJavaFileManager(stdFileManager) {
       public void flush() {
           logger.entering(StandardJavaFileManager.class.getName(), "flush");
           super.flush();
           logger.exiting(StandardJavaFileManager.class.getName(), "flush");
       }
   };
   compiler.getTask(null, fileManager, null, null, null, compilationUnits).call();

Обновление 2

Я читаю на динамической компиляции и построил свое собственное приложение для этого. Этот код содержит слишком много церемонии (I.E. Это может быть упрощено), но это работает!

package yar;

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

public class DynamicCompiler {

   JavaCompiler compiler;

   public DynamicCompiler() {
      this.compiler = ToolProvider.getSystemJavaCompiler();
      if (this.compiler == null) {
         throw new NullPointerException("Cannot provide system compiler.");
      }
   }

   public void compile() {
      this.compiler.run(null, System.out, System.err, 
            "-d", "testFiles2", 
            "testFiles/Hello1.java", "testFiles/Hello2.java");
   }

   /**
    * @param args
    */
   public static void main(String[] args) {
      try {
         DynamicCompiler dc = new DynamicCompiler();
         dc.compile();
      } catch (Exception e) {
         System.err.println(e.getMessage());
      }
   }

}

Я не уверен, как получить этот код работать с динамически сгенерированным списком файлов Java; Я, наверное, просто сделаю Compiler.run отдельно для каждого исходного файла.

4
ответ дан 4 December 2019 в 10:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: