Как запустить процесс до создания файлов .class - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть почти идентичный код для API создания / обновления / удаления, который я пытаюсь заменить моделью шаблона.

Поэтому я определил код контроллера в текстовом шаблоне, а затем при запуске приложения пытаюсьскопировать шаблон в каталог моего проекта и заменить переменные действительными значениями, чтобы сгенерировать API с соответствующими именами классов.

Затем, когда мне нужно внести изменения, я могу изменить свой шаблон, а не каждый API, чтобы уменьшить общее обслуживание кода.Функциональность копирования работает, но это происходит после генерации файлов .class.То есть код, который фактически использует мое приложение, всегда на одну версию позади текущей версии.

Чтобы запустить правильную версию, мне нужно еще раз перезапустить приложение, не меняя шаблонов.Таким образом, текущая версия и предыдущая версия будут идентичны и, похоже, будут работать правильно.

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

src\main\java\com\project\dao\model\User.java:3: error: package com.vividsolutions.jts.geom does not exist
import com.vividsolutions.jts.geom.Point;
                                  ^
src\main\java\com\project\dao\model\User.java:5: error: package javax.persistence does not exist
import javax.persistence.*;

Можно ли:

  1. Создать файлы до создания файлов .class, чтобы проект можно было скомпилировать вместе.Это произошло, если в шаблоне есть ошибки или были указаны неверные переменные, будет сгенерирована ошибка компиляции.

  2. Автоматизируйте перезапуск приложения, прежде чем он станет полностью доступным.Таким образом, код будет запускаться и генерировать файлы из шаблона (ов).Тогда он отключится.Затем он автоматически перезапустится и распознает вновь созданные файлы, чтобы проект можно было скомпилировать вместе.

1 Ответ

0 голосов
/ 10 декабря 2018

Вы можете сделать это, разделив ваши зависимости на две части.Или, другими словами, ваш генератор шаблонов не должен зависеть от классов, которые он генерирует.

Это означает, что вы не должны никуда импортировать, в своем коде генератора шаблонов, классы, сгенерированные шаблоном.

После того как ваши классы скомпилированы, используйте Class.forName("path.to.my.generated.class.Getter"); для создания экземпляров сгенерированных классов.

Практическое правило здесь: для любого класса, который загружается, все его объявленные импорта загружаются первыми.Чтобы избежать загрузки зависимости таким образом, используйте Class.forName(), который загружает класс во время вызова.

Примечание: все исключения / обработка ошибок не учтены.

class MyCodeGenerator {
    public void main(String[] args) {
        generateCode();
        Class getterClass = Class.forName("path.to.my.generated.class.Getter");
        Object getter = getterClass.newInstance();
        Method initMethod = getterClass.getMethod("init");
        initMethod.invoke(getter);
    }
}

class Getter {
    public void init() {
        ...
    }
}
...