[英]Maven integration-test doesn't find my class in same package structure
Here are my files: 这是我的文件:
Pom parent: 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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>my.group</groupId>
<artifactId>my.artifact.pom</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>my.artifact.ws</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.2.RELEASE</version>
</parent>
<properties>
<!-- test -->
<maven.test.failure.ignore>false</maven.test.failure.ignore>
</properties>
//lot of dependencies...
<!-- PROFILES -->
<profiles>
<profile>
<id>local</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<unit-tests.skip>false</unit-tests.skip>
<integration-tests.skip>true</integration-tests.skip>
</properties>
</profile>
<profile>
<id>integration</id>
<modules>
<module>my-module-integration-test</module>
</modules>
<properties>
<unit-tests.skip>true</unit-tests.skip>
<integration-tests.skip>false</integration-tests.skip>
</properties>
</profile>
</profiles>
<!-- PLUGIN -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>${encoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
Module-ws pom: Module-ws 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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>my.artifact.ws</artifactId>
<packaging>jar</packaging>
<parent>
<groupId>my.group</groupId>
<artifactId>my.artifact.pom</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
//lot of dependencies...
</project>
Integration-test pom: 集成测试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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>my.artifact.integration.test</artifactId>
<packaging>jar</packaging>
<parent>
<groupId>my.group</groupId>
<artifactId>my.artifact.pom</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<properties>
<unit-tests.skip>false</unit-tests.skip>
<integration-tests.skip>true</integration-tests.skip>
</properties>
<dependencies>
<dependency>
<groupId>my.group</groupId>
<artifactId>my.artifact.ws</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<executions>
<execution>
<id>integration-test</id>
<goals>
<goal>integration-test</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
My folder structure: 我的文件夹结构:
my-module
|-- my-module-integration-test
| `-- src
| `-- test
| `-- java
| `-- my
| `-- module
| `-- ws
| `-- rest
| `-- MyTest
`-- my-module-ws
`-- src
`-- main
`-- java
`-- my
`-- module
`-- Application
When I run mvn clean install -P integration
I receive the message: 当我运行mvn clean install -P integration
我收到消息:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile (default-testCompile) on project mp-schedule-integration-test: Compilation failure: Compilation failure:
[ERROR] /Users/me/dev/my-module/my-module-integration-test/src/test/java/my/module/ws/rest/MyTest.java:[3,28] cannot find symbol
[ERROR] symbol: class Application
[ERROR] location: package my.module
If I put the Application class inside test structure in my-module-integration-test
it works (Go Horse) 如果我将Application类放在my-module-integration-test
测试结构中,它可以工作(Go Horse)
Could someone help me? 有人能帮助我吗?
Ps.: The name os modules and projects could be wrong just for hide the original names. Ps:名称os模块和项目可能是错误的只是为了隐藏原始名称。
GitHub: https://github.com/LucasHCruz/stack40664101 GitHub: https : //github.com/LucasHCruz/stack40664101
Travis: https://travis-ci.org/LucasHCruz/stack40664101 特拉维斯: https : //travis-ci.org/LucasHCruz/stack40664101
-- Update after github post - github发布后更新
The problem is the repackaging spring-boot-maven-plugin invoked in the pom.xml
of the mp-schedule-ws
module. 问题是在mp-schedule-ws
模块的pom.xml
中调用的重新打包spring-boot-maven-plugin 。 Once spring-boot-maven-plugin
has been included in your pom.xml it will automatically attempt to rewrite archives to make them executable using the spring-boot:repackage
goal. 一旦spring-boot-maven-plugin
包含在你的pom.xml中,它就会自动尝试重写档案,使用spring-boot:repackage
目标使它们可执行。
Due to the dependency in the mp-integration-test
package, the mp-schedule-ws/target/mp-schedule-ws-1.0-SNAPSHOT.jar
will actually be on the classpath, but if you look at the internals you will see it loads org/springframework/boot/loader/*
classes and that your classes will reside in the BOOT-INF
folder, such as BOOT-INF/classes/com/cnova/mpschedule/Application.class
. 由于mp-integration-test
包中的依赖性, mp-schedule-ws/target/mp-schedule-ws-1.0-SNAPSHOT.jar
实际上将在类路径上,但如果你看一下内部,你会看到它加载org/springframework/boot/loader/*
类,并且您的类将驻留在BOOT-INF
文件夹中,例如BOOT-INF/classes/com/cnova/mpschedule/Application.class
。
If you put the spring-boot-maven-plugin in comment, your build works like a charm. 如果你把spring-boot-maven-plugin放在评论中,那么你的构建就像一个魅力。
To solve this , there are some strategies you could follow: 要解决此问题 ,您可以遵循以下策略:
spring-boot-maven-plugin
build execution to a specific packaging profile, so that it is not executed in the integration test profile 有条件地将spring-boot-maven-plugin
构建执行绑定到特定的打包配置文件,以便它不会在集成测试配置文件中执行 An example of the first strategy by adding the classifier in the pom.xml
of the mp-schedule-ws
: 通过在mp-schedule-ws
的pom.xml
中添加分类器的第一个策略示例 :
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
This will give you 2 jars: 这将给你2个罐子:
$ ls -al mp-schedule-ws/target/
-rwxr--r-- 1 nick wheel 55188756 Nov 23 06:38 mp-schedule-ws-1.0-SNAPSHOT-exec.jar
-rw-r--r-- 1 nick wheel 20311 Nov 23 06:38 mp-schedule-ws-1.0-SNAPSHOT.jar
Another example of the second strategy is to define a specific build profile in the mp-schedule-ws
module, such as: 第二个策略的另一个示例是在mp-schedule-ws
模块中定义特定的构建配置文件,例如:
<profiles>
<profile>
<id>package-application</id>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
This gives: 这给出了:
$apache-maven-3.3.9/bin/mvn clean install -P integration
[INFO] mp-schedule ........................................ SUCCESS [ 0.230 s]
[INFO] mp-schedule-core ................................... SUCCESS [ 3.845 s]
[INFO] mp-schedule-ws ..................................... SUCCESS [ 0.563 s]
[INFO] mp-schedule-integration-test ....................... SUCCESS [ 0.721 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.751 s
And to build the executable jar for Spring Boot: 并为Spring Boot构建可执行jar:
$apache-maven-3.3.9/bin/mvn clean install -P package-application
[INFO] mp-schedule ........................................ SUCCESS [ 0.255 s]
[INFO] mp-schedule-core ................................... SUCCESS [ 3.822 s]
[INFO] mp-schedule-ws ..................................... SUCCESS [ 0.968 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.396 s
Of course you can choose the solution strategy that fits your project best. 当然,您可以选择最适合您项目的解决方案策略。
-- old answer - obsolete, kept for reference - 旧答案 - 过时,保留供参考
It works here on maven 3.x, the only thing I had to change was to add the 它在maven 3.x上工作,我唯一需要改变的是添加
<version>1.0-SNAPSHOT</version>
to the my.artifact.ws
since you declared the dependency in my.artifact.integration.test
到my.artifact.ws
因为你宣布的依赖my.artifact.integration.test
<dependency>
<groupId>my.group</groupId>
<artifactId>my.artifact.ws</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
I also added a missing <properties>
start tag in the local profile. 我还在本地配置文件中添加了一个缺少的<properties>
开始标记。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.