Maven, Lombok и Eclipse — осмысленный шаблон интеграции

Итак, я давно хотел использовать Lombok — и наконец-то начинаю проект, в котором смогу его использовать. Важно отметить, что это будет большое приложение корпоративного уровня, поэтому используемые шаблоны интеграции должны быть осмысленными, с минимальным количеством взломов.

Итак, я взглянул на lombok-maven-plugin и на всю эту delombok выдумку. Я понимаю, что это будет дублировать весь мой код и расширять аннотации ломбока, где они есть. Это дает мне второй набор сгенерированных .java файлов, которые maven должен использовать во время компиляции.

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

Некоторые решения предлагают изменить <sourceDirectory> в моем POM. Это не делает ситуацию лучше, так как mvn eclipse:eclipse теперь будет полностью исключать мой каталог src/main/java java из проекта, показывая мне только вывод процесса delombok.

Потом приходят предложения, что мне нужно использовать один профиль для компиляции/упаковки проекта, а другой для mvn eclipse:eclipse. Это неприемлемое решение, так как мне приходится тратить достаточно времени на поддержание/объяснение моей и без того сложной настройки maven — без необходимости вводить совершенно новый профиль (в дополнение к моим существующим профилям).

Я надеюсь на какое-то вдохновение, которое спасет меня от списания Ломбока для моего проекта. Это отличный инструмент для сокращения шаблонного кода, но он просто не готов для корпоративного использования в прайм-тайм, что меня очень разочаровывает :-(

Ниже приведен мой текущий POM:

<build>
    <sourceDirectory>target/generated-sources/delombok</sourceDirectory>
    <testSourceDirectory>target/generated-test-sources/delombok</testSourceDirectory>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok-maven-plugin</artifactId>
            <version>1.12.2.0</version>
            <dependencies>
                <dependency>    
                    <groupId>sun.jdk</groupId>
                    <artifactId>tools</artifactId>
                    <version>1.7</version>
                    <scope>system</scope>
                    <systemPath>${java.home}/../lib/tools.jar</systemPath>
                </dependency>
            </dependencies>
            <executions>
                <execution>
                    <id>delombok</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>delombok</goal>
                    </goals>
                    <configuration>
                        <encoding>UTF-8</encoding>
                        <addOutputDirectory>false</addOutputDirectory>
                        <sourceDirectory>src/main/java</sourceDirectory>
                    </configuration>
                </execution>
                <execution>
                    <id>test-delombok</id>
                    <phase>generate-test-sources</phase>
                    <goals>
                        <goal>testDelombok</goal>
                    </goals>
                    <configuration>
                        <encoding>UTF-8</encoding>
                        <addOutputDirectory>false</addOutputDirectory>
                        <sourceDirectory>src/test/java</sourceDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Который в настоящее время только помещает код деламбокинга в мой проект eclipse.


Последнее замечание. Я также очень разочарован тем, что мне приходится вручную устанавливать lombok на все экземпляры eclipse, которые мы собираемся использовать. В основном потому, что я получаю телефонные звонки от всех разработчиков, которые не могут заставить его работать. Я понимаю, почему это не так просто, как mvn eclipse:eclipse, но все же хотел отметить свое разочарование. Если бы нам пришлось вручную настраивать каждую библиотеку для использования на машине каждого разработчика, мы бы вернулись во времена, когда еще не было Maven.


person jwa    schedule 06.11.2013    source источник
comment
Я не уверен, что мы не сможем заставить mvn eclipse:eclipse работать. Большая часть интеграции maven выполняется другими. Вы можете сообщить о проблеме на странице code.google.com/p/projectlombok/issues/list исследовать это или отправить письмо в список рассылки? Полное раскрытие: я один из разработчиков Project Lombok.   -  person Roel Spilker    schedule 07.11.2013


Ответы (2)


Вам не обязательно использовать lombok-maven-plugin, чтобы воспользоваться преимуществами Ломбока. Насколько я понимаю, деломбофикация, которую выполняет плагин, предназначена для того, чтобы такие вещи, как покрытие кода и javadoc, имели полную версию кода. Даже в этом случае процесс будет происходить, скажем, только во время создания Javadoc.

Вопрос в том, сможет ли ваш проект жить без этого. Если да, то просто добавьте lombok в качестве зависимости от Maven — это все, что вам нужно.

В Eclipse вам действительно нужно его установить. Обратите внимание, что тот факт, что Lombok все еще является экспериментальным, возможно является одной из причин, по которой он не включен в Eclipse по умолчанию.

person Boj    schedule 06.11.2013
comment
Аллилуйя! С таким количеством бафа в документации о деломбках я совершенно упустил из виду тот факт, что вам не нужно его использовать. Спасибо за совет, теперь я могу успешно использовать его в своем проекте :-) - person jwa; 06.11.2013

Мы успешно используем ломбок в нашем проекте уже 1,5 года. Мы не используем никакую деломбокификацию, а вместо этого имеем ломбок в качестве предоставленной зависимости, например так

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>0.11.0</version>
        <scope>provided</scope>
    </dependency>

Это все, что нужно. Мы можем использовать аннотации lombok, и они распознаются как eclipse, так и сборками maven. Это даже совместимо с EclEmma в eclipse, который помечает аннотации как (не)покрытые, когда соответствующий сгенерированный код (нет).

Вы должны установить его на каждый экземпляр Eclipse вручную, так как большая часть JDT не открыта для модификации подключаемых модулей eclipse. Это техническое ограничение, которое разработчики ломбоков не могут снять. В любом случае, установщик довольно прост и никогда меня не подводил.

person Sven Amann    schedule 06.11.2013
comment
Спасибо за совет, я принял ответ от @WIll, так как он был опубликован первым. Обратите внимание, что ломбок доступен в центральном репозитории maven, поэтому нет необходимости в предоставленной области, вы можете позволить maven решить ее самостоятельно! - person jwa; 06.11.2013
comment
@jwa provided не для этого. В этом случае он просто говорит Maven не отправлять ломбок с приложением, скажем, когда вы создаете WAR, он не будет включен. - person Boj; 06.11.2013