当前位置: 首页 > 知识库问答 >
问题:

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

苏承载
2023-03-14

我可以通过源代码集成功地将生成的openapi客户端添加到我的项目中。但是我必须将依赖项复制到主build-gradle中,解决冲突-

所以我添加包括='build: openapi-java-Client'到我的settings.gradle编译项目(': 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'
}

设置。格雷德尔

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

我预先执行openApiGenerate,在将其作为子项目添加之后,我执行Gradle-

然后,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.

我不知道从这里去哪里,寻址子文件夹中的子项目工作得很好,当我通过https://guides.gradle.org/creating-multi-project-builds/并把问候库放在子文件夹中时。

共有3个答案

马欣荣
2023-03-14

我刚刚回答了一个非常类似的问题。虽然我的答案并不完美,但我个人还是更喜欢那里建议的方法——这里也有重复:

我将保持依赖于生成的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来自您的简单java应用程序项目
  2. /gradlew从simple java app/build/openapi java client/目录发布

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

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

./gradlew --include-build $path_to/simple-java-app/build/openapi-java-client/ …
庞书
2023-03-14

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

即使插件驻留在根项目中,目标也需要是一个模块。

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

孙化
2023-03-14

您正试图使build/成为一个项目,而该目录并不意味着是一个项目目录。它是Gradle默认构建目录,可能是99%的其他插件和其他Gradle插件。

只需将输出目录更改为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。生成器似乎生成了无效的生成。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的功能,因此将属性更新为本机,并手动包含一些缺少的依赖项,这一切都可以工作:

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"))
        }
    }
}
 类似资料:
  • 问题内容: 我有一个GWT项目。客户端代码位于“客户端”目录中。我想附加外部目录中的外部Java类(主要是普通的POJO DTO类)。如何配置gwt.xml文件? 我收到此类错误: [错误]“文件:/ C:/development/projects/CodeSpaces/LocateMe/LocateMeWeb/src/com/dominolog/locateme/client/LocateMeW

  • 我找到了这个项目https://github.com/OAI/OpenAPI-Specification据我所知,我们可以用文件。而且,我能看到http://editor.swagger.io/它可以被渲染成文件。 我的问题是-我怎么能生成静态页面从文件?有任何教程的Spring引导应用程序吗?我应该以某种方式设置文件昂首阔步的配置和获得文件留档?

  • 该快速入门将展示如何搭建一个 JavaScript 客户端应用程序,其中的用户将登陆到 IdentityServer,使用 IdentityServer 发布的访问令牌调用 Web API,然后从 IdentityServer 注销。 新的 JavaScript 客户端项目 创建一个新的 JavaScript 应用程序项目。这可以是一个简单的空的 Web 项目,或者空的 ASP.NET Core

  • 我有SQL查询条件<代码>货币在?我使用vertx JDBC客户端方法,它在JsonArray中接收查询参数。 如何将我可能的值列表传递给查询?我尝试了但是得到了异常 组织。postgresql。util。PSQLException:无法推断用于io实例的SQL类型。维特斯。果心json。杰索纳雷。使用带有显式类型值的setObject()指定要使用的类型。

  • 问题内容: 我有以下代码使用SSL将服务器与客户端连接,现在我想添加客户端身份验证: (我有一个服务器密钥库(JCEKS类型)和一个客户端密钥库(JKS类型),服务器使用了一个信任库(证书),在其中我导入了两个证书,因为我也想使用此信任库进行客户端身份验证) 客户代码: 服务器代码: 在此先感谢您的帮助。 编辑:我在服务器端添加此代码: 但是,如果我删除cacerts中的客户端证书,则连接不会给我

  • 我创建了一个由Apollo客户端和graphQL驱动的react应用程序 定义了我的架构,因此预期结果是一个对象数组(<代码>[{名称:“metric 1”,类型:“type A”},{名称:“metric 2”,类型:“type B”})]) 在jsx文件中,我定义了以下查询: 我用Apollo HOC包装了组件,如下所示: Apollo客户端工作正常,并在渲染方法中返回道具的预期列表。 我想让