[英]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 的構建之前,您首先必須運行
./gradlew openApiGenerate
從您的simple-java-app
項目。./gradlew publish
從simple-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.