如何在 gradle java 应用程序中包含来自 openapi-generator 的客户端?
How to include the client from openapi-generator in a gradle java application?
我想创建一个 gradle java 应用程序,它从 openAPI 规范文件生成客户端并使用该客户端。
所以我创建了一个 java 应用程序 gradle init
(type:application, language:Java, DSL:groovy, test-framework:Junit Jupiter, project-name:simple-java-app,包结构:a.aa
).
有效的小例子:
我可以用一个包 b.bb
和一个 class Foo
创建一个新的源文件夹 second/loc/src/main/java
。
以及以下 build.gradle
plugins {
id 'java'
id 'application'
}
repositories {
jcenter()
}
sourceSets {
second {
java {
srcDir 'second/loc/src/main/java'
}
}
}
compileJava {
source += sourceSets.second.java
}
dependencies {
implementation 'com.google.guava:guava:29.0-jre'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.2'
}
application {
mainClassName = 'a.aa.App'
}
test {
useJUnitPlatform()
}
主class可以访问Foo
:
package a.aa;
import b.bb.Foo;
public class App {
public static void main(String[] args) {
System.out.println(new Foo().sayFoo());
}
}
什么不起作用
现在我对 openapi-generator
:
生成的代码进行同样的尝试
在plugins
下我添加id "org.openapi.generator" version "4.3.1"
然后我添加了一个新任务:
openApiGenerate {
generatorName = "java"
inputSpec = "$rootDir/specs/petstore.yaml".toString()
outputDir = "$buildDir/generated".toString()
apiPackage = "org.openapi.example.api"
invokerPackage = "org.openapi.example.invoker"
modelPackage = "org.openapi.example.model"
configOptions = [
dateLibrary: "java8"
]
}
然后我执行任务 openApiGenerate
并在文件系统中确认源已生成(eclipse 不会显示构建文件夹)。
现在我使用与上面相同的方法导致下面 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/generated".toString()
apiPackage = "org.openapi.example.api"
invokerPackage = "org.openapi.example.invoker"
modelPackage = "org.openapi.example.model"
configOptions = [
dateLibrary: "java8"
]
}
sourceSets {
client {
java {
srcDir '$buildDir/generated/src/main/java'
}
}
}
compileJava {
source += sourceSets.client.java
}
dependencies {
implementation 'com.google.guava:guava:29.0-jre'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.2'
}
application {
mainClassName = 'a.aa.App'
}
test {
useJUnitPlatform()
}
但是当我现在尝试使用 classes 时:
package a.aa;
import org.openapi.example.model.Pet;
public class App {
public static void main(String[] args) {
Pet p = new Pet(0L);
System.out.println(p.getId());
}
}
导入和Pet
都无法解决。
> Task :compileJava FAILED
C:\...\simple-java-app\src\main\java\a\aa\App.java:6: error: package org.openapi.example.model does not exist
import org.openapi.example.model.Pet;
^
C:\...\simple-java-app\src\main\java\a\aa\App.java:14: error: cannot find symbol
Pet p = new Pet(0);
^
symbol: class Pet
location: class App
C:\...\simple-java-app\src\main\java\a\aa\App.java:14: error: cannot find symbol
Pet p = new Pet(0);
^
symbol: class Pet
location: class App
3 errors
FAILURE: Build failed with an exception.
我不知道如何调试它,坦率地说,我不确定源集是否正确。所有 openapi-generator 教程似乎都使用它们,我还没有尝试过子项目,openApiGenerate 任务似乎创建了一个包含 build.gradle
和所有内容的完整项目。
您需要将生成的代码的源代码添加到您的项目中。我的一个项目中的一个示例:
sourceSets.main.java.srcDir "${buildDir}/generated/src/main/java"
生成后确保刷新 gradle 和项目。
使用 build.gradle.kts
和 gradle 7+ 我在 Kotlin DSL 中使用:
configure<SourceSetContainer> {
named("main") {
java.srcDir("$buildDir/generated/src/main/java")
}
}
将 java 生成的源添加到项目的源。
我想创建一个 gradle java 应用程序,它从 openAPI 规范文件生成客户端并使用该客户端。
所以我创建了一个 java 应用程序 gradle init
(type:application, language:Java, DSL:groovy, test-framework:Junit Jupiter, project-name:simple-java-app,包结构:a.aa
).
有效的小例子:
我可以用一个包 b.bb
和一个 class Foo
创建一个新的源文件夹 second/loc/src/main/java
。
以及以下 build.gradle
plugins {
id 'java'
id 'application'
}
repositories {
jcenter()
}
sourceSets {
second {
java {
srcDir 'second/loc/src/main/java'
}
}
}
compileJava {
source += sourceSets.second.java
}
dependencies {
implementation 'com.google.guava:guava:29.0-jre'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.2'
}
application {
mainClassName = 'a.aa.App'
}
test {
useJUnitPlatform()
}
主class可以访问Foo
:
package a.aa;
import b.bb.Foo;
public class App {
public static void main(String[] args) {
System.out.println(new Foo().sayFoo());
}
}
什么不起作用
现在我对 openapi-generator
:
在plugins
下我添加id "org.openapi.generator" version "4.3.1"
然后我添加了一个新任务:
openApiGenerate {
generatorName = "java"
inputSpec = "$rootDir/specs/petstore.yaml".toString()
outputDir = "$buildDir/generated".toString()
apiPackage = "org.openapi.example.api"
invokerPackage = "org.openapi.example.invoker"
modelPackage = "org.openapi.example.model"
configOptions = [
dateLibrary: "java8"
]
}
然后我执行任务 openApiGenerate
并在文件系统中确认源已生成(eclipse 不会显示构建文件夹)。
现在我使用与上面相同的方法导致下面 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/generated".toString()
apiPackage = "org.openapi.example.api"
invokerPackage = "org.openapi.example.invoker"
modelPackage = "org.openapi.example.model"
configOptions = [
dateLibrary: "java8"
]
}
sourceSets {
client {
java {
srcDir '$buildDir/generated/src/main/java'
}
}
}
compileJava {
source += sourceSets.client.java
}
dependencies {
implementation 'com.google.guava:guava:29.0-jre'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.2'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.2'
}
application {
mainClassName = 'a.aa.App'
}
test {
useJUnitPlatform()
}
但是当我现在尝试使用 classes 时:
package a.aa;
import org.openapi.example.model.Pet;
public class App {
public static void main(String[] args) {
Pet p = new Pet(0L);
System.out.println(p.getId());
}
}
导入和Pet
都无法解决。
> Task :compileJava FAILED
C:\...\simple-java-app\src\main\java\a\aa\App.java:6: error: package org.openapi.example.model does not exist
import org.openapi.example.model.Pet;
^
C:\...\simple-java-app\src\main\java\a\aa\App.java:14: error: cannot find symbol
Pet p = new Pet(0);
^
symbol: class Pet
location: class App
C:\...\simple-java-app\src\main\java\a\aa\App.java:14: error: cannot find symbol
Pet p = new Pet(0);
^
symbol: class Pet
location: class App
3 errors
FAILURE: Build failed with an exception.
我不知道如何调试它,坦率地说,我不确定源集是否正确。所有 openapi-generator 教程似乎都使用它们,我还没有尝试过子项目,openApiGenerate 任务似乎创建了一个包含 build.gradle
和所有内容的完整项目。
您需要将生成的代码的源代码添加到您的项目中。我的一个项目中的一个示例:
sourceSets.main.java.srcDir "${buildDir}/generated/src/main/java"
生成后确保刷新 gradle 和项目。
使用 build.gradle.kts
和 gradle 7+ 我在 Kotlin DSL 中使用:
configure<SourceSetContainer> {
named("main") {
java.srcDir("$buildDir/generated/src/main/java")
}
}
将 java 生成的源添加到项目的源。