maven-compiler-plugin 3.6.0 не компилирует сгенерированные источники из аннотаций

Мы только что обновили JBoss с 6.1.0 до Wildfly 10.1 и сделали множество связанных обновлений модулей, версий артефактов и так далее. В одном модуле это привело к сбою наших компиляций cobertura с ошибкой компилятора. Я нашел IllegalStateException в генерации метамодели Hibernate с помощью maven и обновил ее до maven- компилятор-плагин 3.6.0 (из 3.1). Казалось, это решило мою проблему, но только на местном уровне. Я могу скомпилировать модуль для cobertura, но оказывается, что это вызывает новую проблему.

Некоторые из источников, сгенерированных аннотациями для этого модуля, используются другим модулем, и файлы классов не найдены. Что изменилось? Каталог сгенерированных источников содержит файлы java, но классы не компилируются.

В какой-то момент это выглядело так, как будто помогла смена фазы build-helper на генерирование источников из источников процесса, но впоследствии это не удалось.

Есть ли что-то еще, что нужно изменить из-за изменений между 3.1 и 3.6.0? (Я не знаком с тем, как обрабатывать аннотации - я просто парень из службы поддержки Cobertura.)

pom файл:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<description>The JPA entities for the Element Manager</description>

<artifactId>em-model</artifactId>
<groupId>com.myprod.em</groupId>

<parent>
    <artifactId>em</artifactId>
    <groupId>com.myprod</groupId>
    <version>3.5.0.0.0-SNAPSHOT</version>
</parent>

<packaging>jar</packaging>

<build>
    <plugins>

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>build-helper-maven-plugin</artifactId>
            <executions>      
               <execution> 
                  <phase>process-sources</phase>
                  <configuration>
                     <sources>
                         <source>${project.build.directory}/generated-sources/annotations</source>
                     </sources>
                  </configuration>
                  <goals>
                     <goal>add-source</goal>
                  </goals>
               </execution>
            </executions>
        </plugin>        

        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <groupId>org.apache.maven.plugins</groupId>
            <configuration>
                <finalName>em-model</finalName>
            </configuration>
        </plugin>

        <plugin>
               <artifactId>maven-compiler-plugin</artifactId>
               <configuration>
                  <compilerArgument>-proc:none</compilerArgument>
               </configuration>
               <executions>
                  <execution>
                     <id>run-annotation-processors-only</id>
                     <phase>generate-sources</phase>
                     <configuration>
                        <compilerArgument>-proc:only</compilerArgument>                            
                     </configuration>
                     <goals>
                        <goal>compile</goal>
                     </goals>
                  </execution>
               </executions>  
        </plugin>

    </plugins>        
</build>

<dependencies>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.el</artifactId>
        <version>3.0.1-b08</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.jboss.spec.javax.ejb</groupId>
        <artifactId>jboss-ejb-api_3.2_spec</artifactId>
        <scope>provided</scope>
    </dependency>

    <!-- Since hibernate validator is used in unit tests, 
         these JBoss logging deps are needed -->        
    <dependency>
        <groupId>org.jboss.slf4j</groupId>
        <artifactId>slf4j-jboss-logmanager</artifactId>
        <scope>provided</scope>    
    </dependency>
     <dependency>
        <groupId>org.jboss.logmanager</groupId>
        <artifactId>jboss-logmanager</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.8.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-io</artifactId>
        <version>1.3.2</version>
        <scope>provided</scope>
    </dependency>    
    <dependency>
        <groupId>com.myco.csp</groupId>
        <artifactId>nrp_jpa</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.myco.cim</groupId>
        <artifactId>cs_cim_jpa</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
           <groupId>org.hibernate</groupId>
           <artifactId>hibernate-jpamodelgen</artifactId>
           <version>1.0.0.Final</version>
           <scope>provided</scope>
    </dependency>

    <!-- Test -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
    </dependency>
    <dependency>
        <groupId>com.myco.logging</groupId>
        <artifactId>logging-client</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>apache-log4j</groupId>
        <artifactId>log4j</artifactId>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.myprod.prodCommon</groupId>
        <artifactId>unit-test-utils</artifactId>
        <version>${project.version}</version>
        <scope>test</scope>
    </dependency>
</dependencies>


person Sinc    schedule 07.03.2018    source источник


Ответы (1)


Я решил эту проблему, удалив аргумент компилятора -proc:none из подключаемого модуля компилятора. В тот момент ни один из сгенерированных исходников вообще не компилировался. С плагином 3.1 у меня это должно было быть, но с 3.6.0 я не могу.

Я также попытался реализовать ответ https://stackoverflow.com/a/35045416/4756238, сделав compilerArg специфичным для фаза компиляции по умолчанию, но на ней не были скомпилированы сгенерированные исходники. Если я не использовал повторно идентификатор компиляции по умолчанию, сборка работала и дала мне сгенерированные файлы классов, но она выполняла две фазы компиляции с -proc:none одной секундой, что казалось избыточным.

Последний раздел pom для компилятора выглядит так:

<plugin>
   <artifactId>maven-compiler-plugin</artifactId>
   <executions>
     <execution>
       <id>run-annotation-processors-only</id>
       <phase>generate-sources</phase>
       <configuration>
         <compilerArgument>-proc:only</compilerArgument>
       </configuration>
       <goals>
         <goal>compile</goal>
       </goals>
     </execution>
   </executions>
</plugin>
person Sinc    schedule 09.03.2018
comment
Re: делая compilerArg специфичным для default-compile, трудно понять, в чем проблема, не видя фактической конфигурации, которую вы пробовали. Вы удалили -proc:none из конфигурации maven-compiler-plugin? Вы добавляли версию 3.6.0 (потому что последняя версия - 3.7.0)? Попробуйте сделать MCVE этого в отдельном вопросе. - person heenenee; 09.03.2018
comment
@heenenee Я добавил раздел компиляции по умолчанию точно так же, как в указанном вами ответе, и удалил конфигурацию -proc: none из верхней части моего раздела. Это не сработало, я все еще не получил сгенерированные файлы классов. Когда я использовал ваше предложение, но оставил идентификатор, сборка сработала, но дважды выполнила компиляцию. Я добавил версию 3.6.0 в свой главный помп и удалил ее примерно из 90 дочерних помпов, среди которых было 4 разные версии. - person Sinc; 09.03.2018
comment
Я даже не могу думать о создании MCVE для этого. У меня есть модуль 8800 LOC примерно в 50 файлах, и я ничего не знаю о коде, позволяющем выделить полезный фрагмент. :( Может ли сборщик тут что-нибудь делать? - person Sinc; 09.03.2018
comment
Я понимаю, но это не сработало, это довольно расплывчато, поэтому сложно дать конкретный ответ. Однако, исходя из того, что вы заявили, я бы предположил, что ваша сборка использует несколько процессоров аннотаций (например, одна фаза, которая использует обработку аннотаций при генерации источников, и другая фаза, обработка аннотаций которой действует на сгенерированные источники из предыдущей фазы) . Это могло бы объяснить, почему удаление -proc:none из default-compile выполнения работает. Это не объясняет, почему вы увидите разные результаты от 3.1 и 3.6.0. - person heenenee; 09.03.2018
comment
Я собирался отметить свой ответ как принятый, но оставлю его еще на несколько дней, чтобы посмотреть, сможет ли кто-нибудь объяснить, почему мне нужно изменить параметры обработки аннотаций между 3.1 и 3.6.0 / 3.7.0. Интересно, может ли это иметь какое-либо отношение к мартовской версии 1.0.0.Final hibernate-jpamodelgen от марта 2010 года? Я могу поиграть с обновлением, когда у меня будет больше времени. - person Sinc; 09.03.2018
comment
Другое предположение, возможно, наличие -proc:none как в конфигурации плагина, так и в конфигурации выполнения было на самом деле , исключая его с звонка на javac? Опробование промежуточных версий между 3.1 и 3.6.0 поможет сузить круг вопросов, в какой именно версии Maven Compiler Plugin внесено изменение, которое нарушило вашу сборку. - person heenenee; 09.03.2018
comment
Просто попробовал обновиться до 3.8.0, но мне пришлось вернуться к 3.1, потому что мои сгенерированные исходники не компилировались. - person rbellamy; 03.11.2018