Spring Boot 使用gradle离线模式构建时,如何指定本地插件?

ugmeyewa  于 2023-02-16  发布在  Spring
关注(0)|答案(1)|浏览(300)

我使用gradle在一个没有网络的环境中构建了这个项目,我把所有的项目依赖项都放到了项目根目录下的libs目录中,一切正常。因为它是一个spring-boot项目,所以我需要使用gradle插件org.springframework.boot来打包它。所以我把插件spring-boot-gradle-plugin-2. 2. 0. RELEASE. jar的jar文件放到了项目的但是我已经使用了很多方法来指定插件目录中的插件,但都不管用。
项目目录如下:

projectRoot
├── build.gradle
├── gradle
│   └── wrapper
├── gradlew
├── gradlew.bat
├── libs
│   └── xxx.jar
├── plugins
│   ├── dependency-management-plugin-1.0.11.RELEASE.jar
│   └── spring-boot-gradle-plugin-2.2.0.RELEASE.jar
├── resource
├── settings.gradle
└── src
    ├── main
    └── test

设置.gradle文件如下所示:

pluginManagement {
    repositories {
        mavenLocal()
        flatDir { dirs 'plugins' }
    }

}
rootProject.name = 'example'

build.gradle文件如下所示:

plugins {
    id 'org.springframework.boot' version '2.2.0.RELEASE'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '1.0.0-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenLocal()
}

dependencies {
    implementation files('libs/xxx.jar','libs/others_of_libs.jar')
}

但当我通过离线模式执行时:./gradlew build --offline,我得到以下错误:

Plugin [id: 'org.springframework.boot', version: '2.2.0.RELEASE'] was not found in any of the following sources:

- Gradle Core Plugins (plugin is not in 'org.gradle' namespace)
- Plugin Repositories (could not resolve plugin artifact 'org.springframework.boot:org.springframework.boot.gradle.plugin:2.2.0.RELEASE')
  Searched in the following repositories:
    maven(file:/User/myName/example/plugins/)

这种情况具体是如何指定的?我需要将插件目录中的两个jar安装到本地maven存储库中吗?
我发现了很多在网络上离线编译特定插件的方法,包括:

buildscript {

    repositories {
        mavenLocal()
        maven { url('plugins') }
    }

    dependencies {
        classpath fileTree(include: ['*.jar'], dir: 'plugins')
        classpath files('plugins/dependency-management-plugin-1.0.11.RELEASE.jar')
        classpath files('plugins/spring-boot-gradle-plugin-2.2.0.RELEASE.jar')
        classpath "io.spring.dependency-management:io.spring.dependency-management.gradle.plugin:1.0.11.RELEASE"
        classpath "org.springframework.boot:spring-boot-gradle-plugin:2.2.0.RELEASE"
    }

}

我仍然得到相同的错误。

t98cgbkg

t98cgbkg1#

我的问题解决了,针对这个问题,我受到了以下链接的启发:Gradle Plugins Offline Resolution
在gradle社区的回答中,我了解了gradle如何解析插件:${pluginId}:${pluginId}.gradle.plugin:${pluginVersion}。所以我把plugins目录中的插件修改成了相应的格式。

buildscript {
    dependencies {
        classpath "io.spring.dependency-management:io.spring.dependency-management.gradle.plugin:1.0.8.RELEASE"
        classpath "org.springframework.boot:org.springframework.boot.gradle.plugin:2.2.0.RELEASE"
    }
}

但是当我执行gradlew --offline bootJar时遇到了一个新的问题,错误如下:

FAILURE: Build failed with an exception.

* What went wrong:
org/springframework/boot/loader/tools/MainClassFinder
> org.springframework.boot.loader.tools.MainClassFinder

于是我用org.springframework. Boot .loader.tools.MainClassFinder类谷歌搜索,发现是spring-boot-loader-tools jar包的内容,我就把这个jar添加到插件中,并修改了buildscript {...} block

buildscript {
    dependencies {
        classpath "io.spring.dependency-management:io.spring.dependency-management.gradle.plugin:1.0.8.RELEASE"
        classpath "org.springframework.boot:org.springframework.boot.gradle.plugin:2.2.0.RELEASE"
        classpath "org.springframework.boot:spring-boot-loader-tools:2.2.0.RELEASE"
    }
}

现在它可以在我的Mac上运行。但是当我把项目放在一个没有互联网的环境中时(最终项目的构建环境是没有互联网的),出现了其他问题,类似于一个类没有被找到。我猜这种问题是bootJar插件执行时找不到相关的依赖项,所以我从我的Mac上复制了.m2文件,最终成功构建并运行。
所以总结一下,有两个问题:
1.插件目录插件名称和用于解析插件名称的gradle不匹配
1.除了在buildscript{}中指定的插件之外,还需要在环境中找到插件的相关依赖项(可能有很多)。为什么我复制了.m2,而不是将所有相关依赖项放入插件中?因为依赖项太多...

相关问题