我正在试图找出为什么我的简单弹簧启动项目不再有效。它基本上是直接从春天的例子,一个控制器说你好世界。我正在使用spring-boot-starter-jetty和spring boot v1.1.10(也试过1.2.0)。我使用嵌入式solr进行了一些单元测试,因此solr-core在pom中标记为<scope>test</scope>
。在添加solr-core依赖项之后,项目不再运行,并且似乎solr-core jetty依赖项与spring-boot-starter-jetty依赖项相冲突(参见下面的Spring Tool Suite截图)。
我认为测试范围的依赖项不应该干扰编译范围的依赖项,并且“仅适用于测试编译和执行阶段” - reference?
如何解决冲突?我想在运行spring boot项目时保留spring-boot-starter-jetty,并在执行测试时使用solr-core。
谢谢!
编辑:添加一个示例pom.xml隔离了问题。<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>
<groupId>test</groupId>
<artifactId>boot-solr-conflict</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.0.RELEASE</version>
</parent>
<dependencies>
<!-- tag::jetty[] -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<!-- end::jetty[] -->
<!-- ################################### -->
<!-- Solr-core dependency for embedded Solr for unit testing. -->
<!-- Causes problem when including this dependency. -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-core</artifactId>
<version>4.7.2</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
Application.java
package test;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args){
SpringApplication.run(Application.class, args);
}
}
MainController.java
package test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class MainController {
@RequestMapping("/")
public @ResponseBody String getRoot(){
return "Hello World";
}
}
答案 0 :(得分:1)
这里有几件事情。
Jetty版本的混合是因为Spring Boot仅包含它直接依赖的Jetty模块的依赖关系管理。您可以通过为所涉及的其他Jetty模块声明自己的依赖关系管理来解决此问题,重用Boot jetty.version
属性。我已经针对Spring Boot打开了an issue,这样我们就可以为Jetty添加更完整的依赖管理。
问题的第二部分是,即使Jetty模块的版本已经对齐,Maven也会忽略一些Jetty编译依赖项,因为它认为它们与solr-core
的传递依赖项冲突。 。我不明白为什么会出现这种情况,因为版本已经对齐并且错误消息确认了这一点:
jetty-xml: 8.1.15.v20140411 (omitted for conflict with 8.1.15.v20140411)
您可以通过使用<dependencyManagement>
来强制解决此问题,通过添加<scope>compile</scope>
来强制某些依赖项成为编译依赖项。 jetty-security
和jetty-server
都需要这样才能启动基本应用。
这是我从问题中添加到pom中的完整<dependencyManagement>
部分:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-continuation</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-deploy</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-http</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-io</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-jmx</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-security</artifactId>
<version>${jetty.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>${jetty.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-xml</artifactId>
<version>${jetty.version}</version>
</dependency>
</dependencies>
</dependencyManagement>