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

pee*_*eer 5 java gradle openapi openapi-generator

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

所以我添加include = 'build:openapi-java-client'了我的settings.gradlecompile 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'
}
Run Code Online (Sandbox Code Playgroud)

settings.gradle

rootProject.name = 'simple-java-app'
include = 'build:openapi-java-client'
Run Code Online (Sandbox Code Playgroud)

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

然后 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.
Run Code Online (Sandbox Code Playgroud)

我不知道从这里开始哪里,当我通过https://guides.gradle.org/creating-multi-project-builds/并放入子文件夹中时,解决greeting-library子文件夹中的子项目工作得很好。

Fra*_*teo 1

当您尝试创建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")
}
Run Code Online (Sandbox Code Playgroud)

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

// settings.gradle
include("openapi-java-client")
Run Code Online (Sandbox Code Playgroud)

但是,使用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']
Run Code Online (Sandbox Code Playgroud)

这显然不会按照您想要的方式工作,因为它似乎是 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"))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但使用这种方法,您将遇到缺少导入/依赖项的情况。该插件似乎并没有提供仅生成模型/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"))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)