swagger-codegen 自定义生成器 ClassNotFound

swagger-codegen custom generator ClassNotFound

我正在为 swagger-codegen 编写自定义生成器。当我尝试使用

运行 生成器时
java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar generate -i path/to/swagger.json -l com.my.company.codegen.MyGenerator -o outputlocation

失败

Can't load config class with name com.my.company.codegen.MyGenerator

... list of built-in generators...

    at io.swagger.codegen.CodegenConfigLoader.forName(CodegenConfigLoader.java:31)
    at io.swagger.codegen.config.CodegenConfigurator.toClientOptInput(CodegenConfigurator.java:286)
    at io.swagger.codegen.cmd.Generate.run(Generate.java:186)
    at io.swagger.codegen.SwaggerCodegen.main(SwaggerCodegen.java:35)
Caused by: java.lang.ClassNotFoundException: com.my.company.codegen.MyGenerator
    at java.net.URLClassLoader.run(URLClassLoader.java:366)
    at java.net.URLClassLoader.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:191)
    at io.swagger.codegen.CodegenConfigLoader.forName(CodegenConfigLoader.java:29)
    ... 3 more

我没有遇到任何内置生成器的问题。

我做了什么才能到达这里(按照自述文件):

  1. 克隆项目
  2. mvn package
  3. java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar meta -o output/myLibrary -n myGenerator -p com.my.company.codegen
  4. 然后是上面的代码

我还尝试了 运行ning mvn package 在制作我的自定义生成器(它没有在我能找到的任何地方制作 .jar 文件)之后再次尝试,并尝试自己创建 .jar 文件。遇到同样的错误。

此外,仅供参考,一些明显的文档不一致肯定增加了我的困惑:我的模块的预期位置在 here and the classname expected here (end of that section). Also, the command for making your own module specifies modules/swagger-codegen-distribution... when I believe it should specify modules/swagger-codegen-cli.... And the guidance in the project readme doesn't seem very congruent with the custom module readme that is generated here.

之间不同

我通常不使用 Java,所以如果我只是遗漏了一些非常明显的东西,我深表歉意。在此先感谢您的帮助!

您需要在 java 命令中包含您的自定义库。例如:

java -cp path/to/your/jar.com:modules/swagger-codegen-cli/target/swagger-codegen-cli.jar \
   -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar \
   {args}

在尝试了很多东西/联网之后,这是有效的方法:

java -cp output/myLibrary/target/myCustomCodegen-swagger-codegen-1.0.0.jar:modules/swagger-codegen-cli/target/swagger-codegen-cli.jar io.swagger.codegen.SwaggerCodegen generate -i path/to/swagger.json -l com.my.company.codegen.MyCustomCodegenGenerator -o outputlocation

以下是我创建自定义生成器必须从头到尾执行的步骤:

  1. git clone 来自来源
  2. cd swagger-codegen
  3. mvn package
  4. java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar meta -o output/myLibrary -n myCustomCodegen -p com.my.company.codegen。这将创建 output/myLibrary 和子目录,您应该在其中找到 myCustomCodegenGenerator.java("Generator" 附加到您在命令中指定的 class 名称)。您还应该能够在资源子目录中找到小胡子模板。
  5. 根据需要对 myCustomCodegenGenerator.java 和模板进行任何更改。
  6. cd output/myLibrary
  7. mvn package
  8. cd ../..
  9. 现在生成您的自定义库:java -cp output/myLibrary/target/myCustomCodegen-swagger-codegen-1.0.0.jar:modules/swagger-codegen-cli/target/swagger-codegen-cli.jar io.swagger.codegen.SwaggerCodegen generate -i path/to/swagger.json -l com.my.company.codegen.MyCustomCodegenGenerator -o outputlocation(在第 7 步中构建应该已经为您生成 target/myCustomCodegen-swagger-codegen-1.0.0.jar

备注:

  • 显然 cding 是基于我放置东西的位置,只是想清楚我在 运行 命令
  • 时的相对位置
  • 如果您只是为您的生成器使用默认生成的基础 class(而不是使用现有语言的子class),您将得到一个异常 FileNotFound myCustomCodegen/myFile.mustache -- 它来自 this optional block,您可以从自定义生成器 class 中注释掉它。
    • 请记得mvn package您进行更改时的自定义模块

请注意,如果您试图在 Windows 和 运行 中从 PowerShell 创建生成器,我必须按如下方式修改@baylee 的步骤:

  1. mvn install

  1. java -cp 'output/myLibrary/target/myCustomCodegen-swagger-codegen-1.0.0.jar;modules/swagger-codegen-cli/target/swagger-codegen-cli.jar' io.swagger.codegen.Codegen -i path/to/swagger.json -l my-language -o outputlocation