繁体   English   中英

如何将 OpenAPI 客户端添加为子项目?

[英]How to add OpenAPI client as a subproject?

我可以通过 source sets 成功地将生成的 openapi 客户端添加到我的项目中 但是然后我必须将依赖项复制到主build-gradle中,解决冲突->我认为将客户端作为具有自己的build.gradle的子项目会是一个更好的设计。

所以我将include = 'build:openapi-java-client'添加到我的settings.gradle并将compile project(':build:openapi-java-client')到我的依赖项中。 这样我就有了以下文件:
build.gradle

plugins {
    id 'java'
    id 'application'
    id "org.openapi.generator" version "4.3.1"
}

repositories {
    jcenter()
}

openApiGenerate {
    generatorName = "java"
    inputSpec = "$rootDir/specs/petstore.yaml".toString()
    outputDir = "$buildDir/openapi-java-client".toString()
    apiPackage = "org.openapi.example.api"
    invokerPackage = "org.openapi.example.invoker"
    modelPackage = "org.openapi.example.model"
    configOptions = [
        dateLibrary: "java8"
    ]
}

dependencies {
    implementation 'com.google.guava:guava:29.0-jre'
    testImplementation 'junit:junit:4.13'
    
    compile project(':build:openapi-java-client')
}

application {
    mainClassName = 'a.aa.App'
}

settings.gradle

rootProject.name = 'simple-java-app'
include = 'build:openapi-java-client'

我提前执行openApiGenerate ,将其添加为子项目后,我执行Gradle -> Refresh Gradle Project and Refresh。

Eclipse 然后告诉我一个问题:

Could not run phased build action using Gradle distribution 'https://services.gradle.org/distributions/gradle-6.5.1-bin.zip'.
Settings file 'C:\...\simple-java-app\settings.gradle' line: 11
A problem occurred evaluating settings 'simple-java-app'.
Could not set unknown property 'include' for settings 'simple-java-app' of type org.gradle.initialization.DefaultSettings.

greeting-library知道go从这里到哪里,当我在子文件夹中处理子项目时,处理子文件夹中的子项目工作得很好

你不能像这样配置它,因为build肯定是一个 output 目录,它会创建一个循环引用。 最好尝试添加一个新模块并将该生成器插件添加到该模块中。 如果您可以将另一个模块配置为outputDir ,则可以引用它。

即使插件驻留在根项目中,目标也必须是模块。

关键是,根项目始终执行,与模块配置相反。

当该目录不打算成为项目目录时,您正在尝试build/项目。 它是 Gradle 默认构建目录和可能 99% 的其他插件和其他 Gradle 插件。

只需将output目录更改为build/以外的其他目录:

openApiGenerate {
    generatorName.set("java")
    inputSpec.set("$rootDir/specs/petstore.json")
    outputDir.set("$rootDir/openapi-java-client")
    apiPackage.set("org.openapi.example.api")
    invokerPackage.set("org.openapi.example.invoker")
    modelPackage.set("org.openapi.example.model")
}

然后使用正确的语法将项目包含在您的构建中:

// settings.gradle
include("openapi-java-client")

但是,使用org.openapi.generator似乎会生成无效的build.gradle ,因为我收到以下错误:

FAILURE: Build failed with an exception.

* Where:
Build file 'C:\Users\fmate\code\example\openapi-java-client\build.gradle' line: 23

* What went wrong:
Could not compile build file 'C:\Users\fmate\code\example\openapi-java-client\build.gradle'.
> startup failed:
  build file 'C:\Users\fmate\code\example\openapi-java-client\build.gradle': 23: unexpected char: '\' @ line 23, column 35.
         main.java.srcDirs = ['src/main\java']

这显然不会像您希望的那样工作,因为它似乎是 Gradle 插件本身的问题。 如果您只需要在项目中包含生成代码,那么只需将生成的 Java 代码包含在您的主要 Java 源代码中即可:

openApiGenerate {
    generatorName.set("java")
    inputSpec.set("$rootDir/specs/petstore.json")
    outputDir.set("$buildDir/openapi-java-client")
    apiPackage.set("org.openapi.example.api")
    invokerPackage.set("org.openapi.example.invoker")
    modelPackage.set("org.openapi.example.model")
}

tasks {
    compileJava {
        dependsOn(openApiGenerate)
    }
}

sourceSets {
    main {
        java {
            srcDir(files("${openApiGenerate.outputDir.get()}/src/main"))
        }
    }
}

但是使用这种方法,您会遇到缺少导入/依赖项的情况。 看起来这个插件并没有提供只生成模型/POJO的能力,所以library属性更新为本native并手动包含一些缺少的依赖项,这一切都有效:

plugins {
    java
    id("org.openapi.generator") version "5.0.0-beta"
}

repositories {
    mavenCentral()
}

group = "io.mateo.test"

dependencies {
    implementation(platform("com.fasterxml.jackson:jackson-bom:2.11.1"))
    implementation("com.fasterxml.jackson.core:jackson-databind")
    implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")
    implementation("org.openapitools:jackson-databind-nullable:0.2.1")
    implementation("com.google.code.findbugs:jsr305:3.0.2")
    implementation("io.swagger:swagger-core:1.6.2")
}

openApiGenerate {
    generatorName.set("java")
    inputSpec.set("$rootDir/specs/petstore.json")
    outputDir.set("$buildDir/openapi-java-client")
    apiPackage.set("org.openapi.example.api")
    invokerPackage.set("org.openapi.example.invoker")
    modelPackage.set("org.openapi.example.model")
    library.set("native")
    configOptions.put("dateLibrary", "java8")
}

tasks {
    compileJava {
        dependsOn(openApiGenerate)
    }
}

sourceSets {
    main {
        java {
            srcDir(files("${openApiGenerate.outputDir.get()}/src/main"))
        }
    }
}

我刚刚回答了一个非常相似的问题。 虽然我的答案并不完美,但我个人仍然更喜欢那里建议的方法 - 并且在这里重复:

建议的方法

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

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

例子

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

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

当然,问题中描述的simple-java-app构建必须适应生成具有这些坐标的模块:

openApiGenerate {
    // …
    groupId = "com.example"
    id = "api"
    version = "1.0"
}

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

  1. ./gradlew openApiGenerate从您的simple-java-app项目。
  2. ./gradlew publishsimple-java-app/build/openapi-java-client/目录发布。

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

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

./gradlew --include-build $path_to/simple-java-app/build/openapi-java-client/ …

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM