为什么maven测试作用域依赖性覆盖编译作用域依赖?

时间:2014-12-16 18:08:52

标签: maven solr spring-boot

我正在试图找出为什么我的简单弹簧启动项目不再有效。它基本上是直接从春天的例子,一个控制器说你好世界。我正在使用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。

screenshot of related dependency

谢谢!

编辑:添加一个示例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";
    }
}

1 个答案:

答案 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-securityjetty-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>