33.构建工具插件

Spring Boot Maven插件

  • Spring Boot Maven插件为Maven提供Spring Boot支持,它允许你打包可执行jar或war存档,然后就地运行应用。为了使用它,你需要使用Maven 3.2 (或更高版本)。

包含该插件

  • 想要使用Spring Boot Maven插件只需简单地在你的pom.xml的 plugins 部分包含相应的XML:
    
    
    4.0.0
    
    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
                1.3.0.BUILD-SNAPSHOT
                
                    
                        
                            repackage
                        
                    
                
            
        
    
    
  • 该配置会在Maven生命周期的 package 阶段重新打包一个jar或war。下面的示例显示在 target 目录下既有重新打包后的jar,也有原始的jar:

      $ mvn package
      $ ls target/*.jar
      target/myproject-1.0.0.jar target/myproject-1.0.0.jar.original
    
  • 如果不包含像上面那样的 ,你可以自己运行该插件(但只有在package目标也被使用的情况)。例如:

      $ mvn package spring-boot:repackage
      $ ls target/*.jar
      target/myproject-1.0.0.jar target/myproject-1.0.0.jar.original
    
  • 如果使用一个里程碑或快照版本,你还需要添加正确的pluginRepository元素:



    spring-snapshots
    http://repo.spring.io/snapshot


    spring-milestones
    http://repo.spring.io/milestone


打包可执行jar和war文件

  • 一旦 spring-boot-maven-plugin 被包含到你的pom.xml中,它就会自动尝试使用 spring-boot:repackage 目标重写存档以使它们能够执行。为了构建一个jar或war,你应该使用常规的packaging元素配置你的项目:

      
      
      
      jar
      
      
    
  • 生成的存档在 package 阶段会被Spring Boot增强。你想启动的main类即可以通过指定一个配置选项,也可以通过为manifest添加一个 Main-Class 属性这种常规的方式实现。如果你没有指定一个main类,该插件会搜索带有 public static void main(String[] args) 方法的类。

  • 为了构建和运行一个项目的artifact,你可以输入以下命令:

      $ mvn package
      $ java -jar target/mymodule-0.0.1-SNAPSHOT.jar
    
  • 为了构建一个即是可执行的,又能部署到一个外部容器的war文件,你需要标记内嵌容器依赖为"provided",例如:

      
      
      
      war
      
      
          
              org.springframework.boot
              spring-boot-starter-web
          
          
              org.springframework.boot
              spring-boot-starter-tomcat
              provided
          
          
      
      
    

Spring Boot Gradle插件

  • Spring Boot Gradle插件为Gradle提供Spring Boot支持,它允许你打包可执行jar或war存档,运行Spring Boot应用,对于"神圣的"依赖可以在你的build.gradle文件中省略版本信息。

包含该插件

  • 想要使用Spring Boot Gradle插件,你只需简单的包含一个 buildscript 依赖,并应用 spring-boot 插件:
buildscript {
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.0.BUILD-SNAPSHOT")
    }
}
apply plugin: 'spring-boot'
  • 如果想使用一个里程碑或快照版本,你可以添加相应的repositories引用:
buildscript {
    repositories {
        maven.url "http://repo.spring.io/snapshot"
        maven.url "http://repo.spring.io/milestone"
    }
// ...
}

声明不带版本的依赖

  • spring-boot 插件会为你的构建注册一个自定义的Gradle ResolutionStrategy ,它允许你在声明对"神圣"的artifacts的依赖时获取版本号。为了充分使用该功能,只需要想通常那样声明依赖,但将版本号设置为空:
dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    compile("org.thymeleaf:thymeleaf-spring4")
    compile("nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect")
}

注:你声明的 spring-boot Gradle插件的版本决定了"blessed"依赖的实际版本(确保可以重复构建)。你最好总是将 springboot gradle插件版本设置为你想用的Spring Boot实际版本。提供的版本详细信息可以在附录中找到。

  • spring-boot 插件对于没有指定版本的依赖只会提供一个版本。如果不想使用插件提供的版本,你可以像平常那样在声明依赖的时候指定版本。例如:
dependencies {
    compile("org.thymeleaf:thymeleaf-spring4:2.1.1.RELEASE")
}
自定义版本管理
  • 如果你需要不同于Spring Boot的"blessed"依赖,有可能的话可以自定义ResolutionStrategy 使用的版本。替代的版本元数据使用 versionManagement 配置。例如:
dependencies {
    versionManagement("com.mycorp:mycorp-versions:1.0.0.RELEASE@properties")
    compile("org.springframework.data:spring-data-hadoop")
}
  • 版本信息需要作为一个 .properties 文件发布到一个仓库中。对于上面的示例, mycorp-versions.properties 文件可能包含以下内容:
  org.springframework.data\:spring-data-hadoop=2.0.0.RELEASE
  • 属性文件优先于Spring Boot默认设置,如果有必要的话可以覆盖版本号。
默认排除规则
  • Gradle处理"exclude rules"的方式和Maven稍微有些不同,在使用starter POMs时这可能会引起无法预料的结果。特别地,当一个依赖可以通过不同的路径访问时,对该依赖声明的exclusions将不会生效。例如,如果一个starter POM声明以下内容:

    
        org.springframework
        spring-core
        4.0.5.RELEASE
            
                
                commons-logging
                commons-logging
                
            
    
    
        org.springframework
        spring-context
        4.0.5.RELEASE
    

  • commons-logging jar不会被Gradle排除,因为通过没有 exclusion 元素的 spring-context 可以传递性的拉取到它(springcontext→ spring-core → commons-logging)。

  • 为了确保正确的排除被实际应用,Spring Boot Gradle插件将自动添加排除规则。所有排除被定义在 spring-boot dependencies POM,并且针对"starter" POMs的隐式规则也会被添加。

  • 如果不想自动应用排除规则,你可以使用以下配置:

    springBoot {
    applyExcludeRules=false
    }
打包可执行jar和war文件
  • 一旦 spring-boot 插件被应用到你的项目,它将使用 bootRepackage 任务自动尝试重写存档以使它们能够执行。为了构建一个jar或war,你需要按通常的方式配置项目。

  • 你想启动的main类既可以通过一个配置选项指定,也可以通过向manifest添加一个 Main-Class 属性。如果你没有指定main类,该插件会搜索带有 public static void main(String[] args) 方法的类。

  • 为了构建和运行一个项目artifact,你可以输入以下内容:

    $ gradle build
    $ java -jar build/libs/mymodule-0.0.1-SNAPSHOT.jar
    
  • 为了构建一个即能执行也可以部署到外部容器的war包,你需要将内嵌容器依赖标记为"providedRuntime",比如:

...
apply plugin: 'war'
war {
    baseName = 'myapp'
    version = '0.5.0'
}
repositories {
    jcenter()
    maven { url "http://repo.spring.io/libs-snapshot" }
}
configurations {
    providedRuntime
}
dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    providedRuntime("org.springframework.boot:spring-boot-starter-tomcat")
    ...
}
就地(in-place)运行项目
  • 为了在不先构建jar的情况下运行项目,你可以使用"bootRun"任务:
 $ gradle bootRun
  • 默认情况下,以这种方式运行项目可以让你的静态classpath资源(比如,默认位于 src/main/resources 下)在应用运行期间被重新加载。使静态资源可以重新加载意味着 bootRun 任务不会使用 processResources 任务的输出,比如,当调用 bootRun 时,你的应用将以资源未处理的形式来使用它们。

  • 你可以禁止直接使用静态classpath资源。这意味着资源不再是可重新加载的,但 processResources 任务的输出将会被使用。想要这样做,只需将 bootRun 任务的 addResources 设为false:

bootRun {
addResources = false
}
Spring Boot插件配置
  • Gradle插件自动扩展你的构建脚本DSL,它为脚本添加一个 springBoot 元素以此作为Boot插件的全局配置。你可以像配置其他Gradle扩展那样为 springBoot 设置相应的属性(下面有配置选项列表)。
springBoot {
backupSource = false
}
Repackage配置
  • 该插件添加了一个bootRepackage任务,你可以直接配置它,比如:
bootRepackage {
mainClass = 'demo.Application'
}

下面是可用的配置选项:

名称 描述
enabled 布尔值,用于控制repackager的开关(如果你只想要Boot的其他特性而不是这个,那它就派上用场了)
mainClass 要运行的main类。如果没有指定,则使用project属性mainClassName。如果没有定义mainClassName id,则搜索存档以寻找一个合适的类。"合适"意味着一个唯一的,具有良好格式的 main() 方法的类(如果找到多个则构建会失败)。你也可以通过"run"任务(main属性)指定main类的名称,和/或将"startScripts"(mainClassName属性)作为"springBoot"配置的替代。
classifier 添加到存档的一个文件名字段(在扩展之前),这样最初保存的存档仍旧存放在最初的位置。在存档被重新打包(repackage)的情况下,该属性默认为null。默认值适用于多数情况,但如果你想在另一个项目中使用原jar作为依赖,最好使用一个扩展来定义该可执行jar
withJarTask Jar任务的名称或值,用于定位要被repackage的存档
customConfiguration 自定义配置的名称,用于填充内嵌的lib目录(不指定该属性,你将获取所有编译和运行时依赖)
理解Gradle插件是如何工作的
  • 当 spring-boot 被应用到你的Gradle项目,一个默认的名叫 bootRepackage 的任务被自动创建。 bootRepackage 任务依赖于Gradle assemble 任务,当执行时,它会尝试找到所有限定符为空的jar artifacts(也就是说,tests和sources jars被自动跳过)。

Spring Boot Maven和Gradle插件都利用 spring-boot-loader-tools 来实际地产生jars。如果需要,你也可以自由地直接使用该库。

你可能感兴趣的:(33.构建工具插件)