Объявление зависимостей Maven вызывает изменения в процедуре компиляции? - PullRequest
1 голос
/ 17 апреля 2019

Итак, у меня есть приложение, которое использует как исходные файлы Java, так и Kotlin (все они находятся в каталоге /src/main/kotlin, потому что мы все равно хотим перейти на kotlin) и которое генерирует метамодель гибернации.

плагины компиляции maven выглядят так:

<build>
    <sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
    <testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
    <finalName>${project.artifactId}</finalName>
    <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <!--COMPILATION-->
            <plugin>
                <groupId>org.jetbrains.kotlin</groupId>
                <artifactId>kotlin-maven-plugin</artifactId>
                <version>${kotlin.version}</version>
                <executions>
                    <execution>
                        <id>kapt</id>
                        <goals>
                            <goal>kapt</goal>
                        </goals>
                        <configuration>
                            <sourceDirs>
                                <sourceDir>src/main/kotlin</sourceDir>
                            </sourceDirs>
                            <annotationProcessorPaths>
                                <annotationProcessorPath>
                                    <groupId>org.hibernate</groupId>
                                    <artifactId>hibernate-jpamodelgen</artifactId>
                                    <version>${hibernate.version}</version>
                                </annotationProcessorPath>
                            </annotationProcessorPaths>
                        </configuration>
                    </execution>
                    <execution>
                        <id>compile</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>test-compile</id>
                        <phase>test-compile</phase>
                        <goals>
                            <goal>test-compile</goal>
                        </goals>
                    </execution>
                </executions>

                <configuration>
                    <jvmTarget>1.8</jvmTarget>

                    <compilerPlugins>
                        <plugin>all-open</plugin>
                        <plugin>jpa</plugin>
                        <plugin>spring</plugin>
                        <plugin>no-arg</plugin>
                    </compilerPlugins>
                    <args>
                        <arg>-Xjsr305=strict</arg>
                    </args>

                    <pluginOptions>
                        <!-- Each annotation is placed on its own line -->
                        <option>all-open:annotation=javax.ejb.Stateless</option>
                        <option>no-arg:annotation=javax.ejb.Stateless</option>

                        <option>all-open:annotation=javax.ws.rs.ext.Provider</option>
                        <option>no-arg:annotation=javax.ws.rs.ext.Provider</option>

                    </pluginOptions>
                </configuration>

                <dependencies>
                    <dependency>
                        <groupId>org.jetbrains.kotlin</groupId>
                        <artifactId>kotlin-maven-allopen</artifactId>
                        <version>${kotlin.version}</version>
                    </dependency>
                    <dependency>
                        <groupId>org.jetbrains.kotlin</groupId>
                        <artifactId>kotlin-maven-noarg</artifactId>
                        <version>${kotlin.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <!-- Check https://kotlinlang.org/docs/reference/using-maven.html#compiling-kotlin-and-java-sources -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <executions>
                    <!-- Replacing default-compile as it is treated specially by maven -->
                    <execution>
                        <id>default-compile</id>
                        <phase>none</phase>
                    </execution>
                    <!-- Replacing default-testCompile as it is treated specially by maven -->
                    <execution>
                        <id>default-testCompile</id>
                        <phase>none</phase>
                    </execution>
                    <execution>
                        <id>java-compile</id>
                        <phase>compile</phase>
                        <goals> <goal>compile</goal> </goals>
                    </execution>
                    <execution>
                        <id>java-test-compile</id>
                        <phase>test-compile</phase>
                        <goals> <goal>testCompile</goal> </goals>
                    </execution>
                </executions>
            </plugin>
            <!--END COMPILATION-->

            <!-- ... -->    
    </plugins>
</build>

это приводит к

[WARNING] Duplicate source root: /home/cypherk/code/myapp/target/generated-sources/kapt/compile
[WARNING] Duplicate source root: /home/cypherk/code/myapp/target/generated-sources/kaptKotlin/compile

, что я понятия не имею, но может быть связано.

Если я делаю not объявляет зависимость от

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jpamodelgen</artifactId>
    <version>${hibernate.version}</version>
</dependency>

в <dependencies>, все в порядке, все генерируется так, как это должно быть сгенерировано в /target/generated-sources/kapt/compile/.(/target/generated-sources-kaptKotlin/compile генерируется, но остается пустым).

Однако, если я do объявляю зависимость в <dependencies>, сущности java (но не kotlin) будут генерироваться second time in /target/generated-sources/annotations/, что приведет к ошибке компиляции, поскольку все сгенерированные Java-классы имеют duplicate class в папке kapt.

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

Может ли кто-нибудь объяснить мне, почему это происходит?

1 Ответ

0 голосов
/ 03 июля 2019

Не знаю почему, но когда вы меняете выполнение компиляции на:

<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
    <goal>compile</goal>
</goals>
<configuration>
    <sourceDirs>
        <sourceDir>src/main/kotlin</sourceDir>
    </sourceDirs>
</configuration>
</execution>

Это должно работать.То же самое с test-compile.

...