簡體   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