compile 和 provided 有什么区别

What is different between compile and provided

当我将 <scope> 设置为 provided 时,我的应用程序无法运行。然而,当它被编译时,它起作用了。你能解释一下它们之间有什么不同吗?

这里是tileConfigclass设置路径

@Configuration
public class TilesConfig {

    @Bean
    public ViewResolver viewResolver() {
        UrlBasedViewResolver viewResolver = new UrlBasedViewResolver();
        viewResolver.setViewClass(TilesView.class);
        return viewResolver;
    }

    @Bean
    public TilesConfigurer tilesConfigurer() {
        TilesConfigurer tilesConfigurer = new TilesConfigurer();
        tilesConfigurer.setDefinitions("/WEB-INF/tiles.xml");

        return tilesConfigurer;
}

并且我添加了 Apache Tiles 3 和 JSP 的依赖项。因为 Spring Boot 中的嵌入式服务器 (tomcat) 不支持 JPS。

以下 pom.xml 有效,但当我按照 tomcat-embed-jasper 中的规定添加 <scope> 时。它不起作用:

    <!-- Apache Tiles 3 -->
    <dependency>
        <groupId>org.apache.tiles</groupId>
        <artifactId>tiles-jsp</artifactId>
        <version>3.0.8</version>
    </dependency>

    <!-- JSP -->
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
    </dependency>

provided 表示您希望容器 (Tomcat) 提供依赖项。提供的依赖项用于编译但未打包到您的应用程序中。

compile 依赖项已打包到您的应用程序中。

如果您指定所提供的范围,则表示您希望 JDK 或容器在运行时提供依赖项。那里不存在此依赖项,因此无法找到它。

  • compile 是默认范围 - 这些依赖项在所有项目类路径中都可用
  • 已提供 - 这些依赖项预计会出现在您的环境中
  • 运行时 - 编译时不需要,但运行时需要存在
  • 测试 - 测试需要
  • 系统 - 与提供的一样,但您需要提供 jar 文件