Kotlin 多模块项目依赖在测试生命周期中未解决
Kotlin Multi-module Project Dependency is Unresolved in test Lifecycle
项目结构:
纯 Kotlin 作为多模块 Maven 应用程序
kotlinspringboot(根模块)
api
集成测试
问题:
当我 运行
$ cd ./kotlingspringboot/integration-tests/
$ mvn test
或
$ cd ./kotlingspringboot/integration-tests/
$ mvn kotlin:test-compile
关于来自 api 模块的 class 的未解析引用,我收到以下编译错误:
[ERROR] Failed to execute goal org.jetbrains.kotlin:kotlin-maven-plugin:1.2.21:test-compile (test-compile) on project hello-integration-tests: Compilation failure: Compilation failure:
[ERROR] C:\workspace\kotlinspringboot\integration-tests\src\test\kotlin\org\ildar\hello\integration\HelloEndpointTests.kt:[6,18] Unresolved reference: SpringKotlinHelloWorldApplication
注意:我 运行 之前 mvn clean install 并验证 .m2 缓存包含有效的 api 模块 jar。
api(子模块)pom.xml
....
<parent>
<artifactId>kotlin-spring-boot</artifactId>
<groupId>org.ildar</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>hello-api</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
....
集成测试(子模块)pom.xml
<parent>
<artifactId>kotlin-spring-boot</artifactId>
<groupId>org.ildar</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>hello-integration-tests</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
<plugins>
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<goals> <goal>compile</goal> </goals>
</execution>
<execution>
<id>test-compile</id>
<goals> <goal>test-compile</goal> </goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Link 到 github 上的项目:
https://github.com/IldarGalikov/kotlinspringboot
问题是由Spring Boot 重新打包API jar 引起的。它将应用程序的 class 文件从 jar 的根目录移动到 jar 中的 BOOT-INF/classes 文件夹中。编译集成测试时,kotlin 编译器仅在 jar 的根目录中搜索 class 文件,而不会查看 BOOT-INF 文件夹。因此,它无法解析对 API jar 中 classes 的引用。
by Damien 描述了如何使 Spring 引导将您的应用程序 class 保留在 jar 的根目录中。如果我将那里提到的配置添加到您的 api/pom.xml,您项目中的集成测试将按预期编译:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>MODULE</layout>
</configuration>
</plugin>
自从 Spring 在 Spring Boot 2.0 中删除了 "MODULE" 布局,maven 在尝试 Christophs 回答时抱怨不存在的 LayoutType ENUM。
虽然查看文档帮助我解决了问题:https://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/repackage-classifier.html
具体将此添加到 spring-boot-maven-plugin:
<executions>
<execution>
<id>repackage</id>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
项目结构: 纯 Kotlin 作为多模块 Maven 应用程序
kotlinspringboot(根模块)
api
集成测试
问题: 当我 运行
$ cd ./kotlingspringboot/integration-tests/
$ mvn test
或
$ cd ./kotlingspringboot/integration-tests/
$ mvn kotlin:test-compile
关于来自 api 模块的 class 的未解析引用,我收到以下编译错误:
[ERROR] Failed to execute goal org.jetbrains.kotlin:kotlin-maven-plugin:1.2.21:test-compile (test-compile) on project hello-integration-tests: Compilation failure: Compilation failure:
[ERROR] C:\workspace\kotlinspringboot\integration-tests\src\test\kotlin\org\ildar\hello\integration\HelloEndpointTests.kt:[6,18] Unresolved reference: SpringKotlinHelloWorldApplication
注意:我 运行 之前 mvn clean install 并验证 .m2 缓存包含有效的 api 模块 jar。
api(子模块)pom.xml
....
<parent>
<artifactId>kotlin-spring-boot</artifactId>
<groupId>org.ildar</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>hello-api</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
....
集成测试(子模块)pom.xml
<parent>
<artifactId>kotlin-spring-boot</artifactId>
<groupId>org.ildar</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>hello-integration-tests</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
<plugins>
<plugin>
<artifactId>kotlin-maven-plugin</artifactId>
<groupId>org.jetbrains.kotlin</groupId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<goals> <goal>compile</goal> </goals>
</execution>
<execution>
<id>test-compile</id>
<goals> <goal>test-compile</goal> </goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Link 到 github 上的项目: https://github.com/IldarGalikov/kotlinspringboot
问题是由Spring Boot 重新打包API jar 引起的。它将应用程序的 class 文件从 jar 的根目录移动到 jar 中的 BOOT-INF/classes 文件夹中。编译集成测试时,kotlin 编译器仅在 jar 的根目录中搜索 class 文件,而不会查看 BOOT-INF 文件夹。因此,它无法解析对 API jar 中 classes 的引用。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>MODULE</layout>
</configuration>
</plugin>
自从 Spring 在 Spring Boot 2.0 中删除了 "MODULE" 布局,maven 在尝试 Christophs 回答时抱怨不存在的 LayoutType ENUM。
虽然查看文档帮助我解决了问题:https://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/repackage-classifier.html
具体将此添加到 spring-boot-maven-plugin:
<executions>
<execution>
<id>repackage</id>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>