如何生成、编译、jar 和依赖一个 gradle 模块 示例

如何解决如何生成、编译、jar 和依赖一个 gradle 模块 示例

我有一个使用 OpenAPI 指定 API 的 Java Gradle 项目。我使用了 org.openapi.generator 插件,它可以生成源代码和完整的 Gradle 模块。

我希望有一种方法可以定义生成、编译、jar 步骤,以便我可以让其他模块依赖于生成的模块。

# api/build.gradle:
plugins {
    id 'java'
    id "org.openapi.generator" version "5.0.0"
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation group: 'junit',name: 'junit',version: '4.12'
}

compileJava.dependsOn "openApiGenerate"

openApiGenerate {
    generatorName = "java"
    inputSpec = "$projectDir/src/main/openapi/spec.yaml".toString()
    outputDir = "$buildDir/generated"
    apiPackage = "com.example.api"
    invokerPackage = "com.example.api.invoker"
    modelPackage = "com.example.api.model"
    configOptions = [
            dateLibrary: "java8",library    : "native"
    ]
    groupId = "com.example"
    id = "api"
}

gradlew api:openApiGenerate 生成(忽略了无关文件):

api/build/generated/
├── build.gradle
├── pom.xml
├── settings.gradle
└── src
    ├── main/java/...
    └── test/java/...

有什么方法可以委托、包含或依赖来自项目中其他模块的这个生成的模块?生成的模块具有可靠的 group:artifact:version 坐标。

即我希望能够在项目的其他地方指定 com.example:api:1.0


我已经通读了 https://docs.gradle.org/current/userguide/composite_builds.html,因为它似乎接近我的预期,但我是 Gradle 的新手,它有点深入。

我尝试覆盖 api/build.gradle 中的主要和测试源集,但我不喜欢必须从 api/build/generated/build.gradle 复制和粘贴依赖项。

我发现 https://docs.gradle.org/current/userguide/declaring_dependencies.html#sec:dependency-types 包含一个诱人的示例,但由于它是纯源依赖项而失败了。

dependencies {
    implementation files("$buildDir/classes") {
        builtBy 'compile'
    }
}

我查看了这个示例,但如何依赖尚不存在的项目 (api/build/generated/)?

dependencies {
    implementation project(':shared')
}

解决方法

好问题!我没有完美的答案,但希望以下内容仍然会有所帮助。

建议的方法

我会将依赖于生成的 API 的模块的 builds 与生成 API 的 build 完全分开。这种构建之间的唯一联系应该是依赖声明。这意味着,您必须手动确保先构建 API 生成项目,然后才构建依赖项目。

默认情况下,这意味着还要在构建依赖项目之前发布 API 模块。这种默认设置的替代方案确实是复合构建——例如,允许您在发布之前先在本地测试新生成的 API。但是,在创建/运行复合构建之前,您必须在每次 OpenAPI 文档更改时手动运行 API 生成构建。

示例

假设您有项目 A,具体取决于生成的 API。它的 Gradle 构建将包含如下内容:

dependencies {
    implementation 'com.example:api:1.0'
}

在运行 A 的构建之前,您首先必须运行

  1. ./gradlew openApiGenerate 来自您的 api 项目。
  2. ./gradlew publish 来自 api/build/generated/ 目录。

然后 A 的构建可以从发布存储库中获取已发布的依赖项。

或者,您可以在本地删除第 2 步并使用额外的 Gradle CLI 选项运行 A 的构建:

./gradlew --include-build $path_to/api/build/generated/ …

减少手工工作的想法

我对此考虑了很多,但没有想出任何完整的解决方案——因此我上面的建议并不完美。让我仍然总结一下我对如何如何工作的想法。

  • 您将拥有一个生成 API 的 Gradle 构建版本 - 类似于您的 api 项目。该构建也将提交给您的 VCS。
  • 该构建会发布生成的 API,即使它本身不会生成它。相反,它会以某种方式委托给 openApiGenerate 任务生成的 Gradle 构建。委托必须通过 GradleBuild task 进行。
    关键在于:所有有关依赖项和已发布工件的信息都必须通过 Gradle CLI 有效地检索。我怀疑目前是否可行。
  • 依赖 API 的项目然后可以在复合构建中包含类似 api 的 Gradle 项目,而无需上述方法中的手动麻烦。
,

用我实际使用的内容扩展@Chriki 的回答:

  1. 使用空的 api/ 文件将 api/settings.gradle 定义为自己的项目。

    这告诉 gradle 它是一个独立的项目。

  2. 定义 api 模块:

    # api/build.gradle
    plugins {
       id 'java'
       id "org.openapi.generator" version "5.0.0"
    }
    
    repositories {
       mavenCentral()
    }
    
    openApiGenerate {
       generatorName = "java"
       inputSpec = "$projectDir/src/main/openapi/specification.yaml"
       outputDir = "$buildDir/generated"
       apiPackage = "com.example.api"
       invokerPackage = "com.example.api.invoker"
       modelPackage = "com.example.api.model"
       configOptions = [
          dateLibrary: "java8",library    : "native"
       ]
       groupId = "com.example"
       id = "api"
       version = "1.0.0"
    }
    

    注意 groupid(和 version)明确定义了它的 maven 坐标。

  3. 包含带有替换的构建,以便依赖项可以仅使用其 maven 坐标:

    # settings.gradle
    
    includeBuild('api/build/generated') {
        dependencySubstitution {
            substitute module('com.example:api') with project(':')
        }
    }
    

    ...以及在其他一些模块中:

    # app/build.gradle
    
    dependencies {
       implementation group: 'com.example',name: 'api'
    }
    

    ./gradlew --include-build api/build/generated 相比,它的主要优点是 [我的] IDE 也会将其全部“链接”起来。

  4. 生成 API 库:

     ./gradlew --project-dir api/ openApiGenerate
    
  5. 构建/运行主项目:

     ./gradlew build
     ./gradlew run
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res