From dbb010bf7d292338c0eea47e4c4417435d7cc486 Mon Sep 17 00:00:00 2001 From: Nils Braune <78608305+adnbrownie@users.noreply.github.com> Date: Fri, 6 Jan 2023 23:30:48 +0100 Subject: [PATCH 1/5] support JAVA_HOME environment variable fixes #661 --- apps/generator-cli/src/app/services/generator.service.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/generator-cli/src/app/services/generator.service.ts b/apps/generator-cli/src/app/services/generator.service.ts index dd142c3da..404fc90e3 100644 --- a/apps/generator-cli/src/app/services/generator.service.ts +++ b/apps/generator-cli/src/app/services/generator.service.ts @@ -191,8 +191,10 @@ export class GeneratorService { const subCmd = customGenerator ? `-cp "${[cliPath, customGenerator].join(this.isWin() ? ';' : ':')}" org.openapitools.codegen.OpenAPIGenerator` : `-jar "${cliPath}"`; + const javaHome = process.env['JAVA_HOME']; + const javaCmd = javaHome ? `${javaHome}/bin/java` : 'java'; return [ - 'java', + javaCmd, process.env['JAVA_OPTS'], subCmd, 'generate', From ac4a81cfcc63135c15d1ad5148e943de12bfa3b0 Mon Sep 17 00:00:00 2001 From: mok-liee <6745620+mok-liee@users.noreply.github.com> Date: Wed, 28 Feb 2024 17:39:34 +0100 Subject: [PATCH 2/5] test(generator-cmd): add consideration of the JAVA_HOME variable --- .../app/services/generator.service.spec.ts | 54 ++++++++++++------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/apps/generator-cli/src/app/services/generator.service.spec.ts b/apps/generator-cli/src/app/services/generator.service.spec.ts index 5a90c8375..0bacfb344 100644 --- a/apps/generator-cli/src/app/services/generator.service.spec.ts +++ b/apps/generator-cli/src/app/services/generator.service.spec.ts @@ -126,41 +126,45 @@ describe('GeneratorService', () => { }); }); - const cmd = (name, appendix: string[]) => ({ + const cmd = (name: string, javaCmd: string, appendix: string[]) => ({ name, - command: `java -jar "/path/to/4.2.1.jar" generate ${appendix.join( + command: `${javaCmd} -jar "/path/to/4.2.1.jar" generate ${appendix.join( ' ' )}`, }); const cmdWithCustomJar = ( name: string, + javaCmd: string, customJar: string, appendix: string[] ) => ({ name, - command: `java -cp "/path/to/4.2.1.jar:${customJar}" org.openapitools.codegen.OpenAPIGenerator generate ${appendix.join( + command: `${javaCmd} -cp "/path/to/4.2.1.jar:${customJar}" org.openapitools.codegen.OpenAPIGenerator generate ${appendix.join( ' ' )}`, }); + const javaHome = process.env['JAVA_HOME']; + const javaCmd = javaHome ? `${javaHome}/bin/java` : 'java'; + describe.each([ [ 'foo.json', [ - cmd('[angular] abc/app/pet.yaml', [ + cmd('[angular] abc/app/pet.yaml', javaCmd, [ `--input-spec="${cwd}/abc/app/pet.yaml"`, `--output="${cwd}/generated-sources/openapi/typescript-angular/pet"`, `--generator-name="typescript-angular"`, `--additional-properties="fileNaming=kebab-case,apiModulePrefix=Pet,npmName=petRestClient,supportsES6=true,withInterfaces=true"`, ]), - cmd('[angular] abc/app/car.yaml', [ + cmd('[angular] abc/app/car.yaml', javaCmd, [ `--input-spec="${cwd}/abc/app/car.yaml"`, `--output="${cwd}/generated-sources/openapi/typescript-angular/car"`, `--generator-name="typescript-angular"`, `--additional-properties="fileNaming=kebab-case,apiModulePrefix=Car,npmName=carRestClient,supportsES6=true,withInterfaces=true"`, ]), - cmd('[baz] def/app/pet.yaml', [ + cmd('[baz] def/app/pet.yaml', javaCmd, [ `--input-spec="${cwd}/def/app/pet.yaml"`, `--name="pet"`, `--name-uc-first="Pet"`, @@ -174,7 +178,7 @@ describe('GeneratorService', () => { '--some-bool', '--some-int=1', ]), - cmd('[baz] def/app/car.json', [ + cmd('[baz] def/app/car.json', javaCmd, [ `--input-spec="${cwd}/def/app/car.json"`, `--name="car"`, `--name-uc-first="Car"`, @@ -193,12 +197,12 @@ describe('GeneratorService', () => { [ 'bar.json', [ - cmd('[bar] api/cat.yaml', [ + cmd('[bar] api/cat.yaml', javaCmd, [ `--input-spec="${cwd}/api/cat.yaml"`, `--output="bar/cat"`, '--some-bool', ]), - cmd('[bar] api/bird.json', [ + cmd('[bar] api/bird.json', javaCmd, [ `--input-spec="${cwd}/api/bird.json"`, `--output="bar/bird"`, '--some-bool', @@ -208,16 +212,26 @@ describe('GeneratorService', () => { [ 'bar.json', [ - cmdWithCustomJar('[bar] api/cat.yaml', '../some/custom.jar', [ - `--input-spec="${cwd}/api/cat.yaml"`, - `--output="bar/cat"`, - '--some-bool', - ]), - cmdWithCustomJar('[bar] api/bird.json', '../some/custom.jar', [ - `--input-spec="${cwd}/api/bird.json"`, - `--output="bar/bird"`, - '--some-bool', - ]), + cmdWithCustomJar( + '[bar] api/cat.yaml', + javaCmd, + '../some/custom.jar', + [ + `--input-spec="${cwd}/api/cat.yaml"`, + `--output="bar/cat"`, + '--some-bool', + ] + ), + cmdWithCustomJar( + '[bar] api/bird.json', + javaCmd, + '../some/custom.jar', + [ + `--input-spec="${cwd}/api/bird.json"`, + `--output="bar/bird"`, + '--some-bool', + ] + ), ], '../some/custom.jar', ], @@ -226,7 +240,7 @@ describe('GeneratorService', () => { [ 'no-glob.json', [ - cmd('[noGlob] http://example.local/openapi.json', [ + cmd('[noGlob] http://example.local/openapi.json', javaCmd, [ `--input-spec="http://example.local/openapi.json"`, `--output="no-glob/openapi"`, `--name="openapi"`, From f96430cf3a67838beaa1604a8766d79485fb0fa9 Mon Sep 17 00:00:00 2001 From: mok-liee <6745620+mok-liee@users.noreply.github.com> Date: Wed, 28 Feb 2024 22:16:35 +0100 Subject: [PATCH 3/5] docs: add instructions for the use of JAVA_HOME --- apps/generator-cli/src/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/generator-cli/src/README.md b/apps/generator-cli/src/README.md index a99441128..f30bf7b6f 100644 --- a/apps/generator-cli/src/README.md +++ b/apps/generator-cli/src/README.md @@ -10,7 +10,7 @@ OpenAPI Generator allows generation of API client libraries (SDK generation), se configuration automatically given an OpenAPI Spec (both 2.0 and 3.0 are supported). Please see [OpenAPITools/openapi-generator](https://github.com/OpenAPITools/openapi-generator). -The OpenAPI Generator is a Java project. `openapi-generator-cli` will download the appropriate JAR file and invoke the `java` executable to run the OpenAPI Generator. You must have the `java` binary executable available on your `PATH` for this to work. +The OpenAPI Generator is a Java project. `openapi-generator-cli` will download the appropriate JAR file and invoke the `java` executable to run the OpenAPI Generator. You must have the `java` binary executable available on your `PATH` or have set `JAVA_HOME` correctly for this to work. If you find this tool useful, please consider sponsoring this project financially via https://opencollective.com/openapi_generator or directly to [Kay Schecker](https://github.com/sponsors/kay-schecker) (the author of this tool) :pray: From ce2ac4cce34b0de4ce9df252868927e08ae72cd7 Mon Sep 17 00:00:00 2001 From: mok-liee <6745620+mok-liee@users.noreply.github.com> Date: Wed, 28 Feb 2024 22:23:14 +0100 Subject: [PATCH 4/5] fix: add quotes to accept spaces in the JAVA_HOME path --- apps/generator-cli/src/app/helpers/index.ts | 7 +++++++ .../src/app/services/generator.service.spec.ts | 4 +--- .../src/app/services/generator.service.ts | 16 +++++----------- .../app/services/pass-through.service.spec.ts | 9 +++++---- .../src/app/services/pass-through.service.ts | 3 ++- 5 files changed, 20 insertions(+), 19 deletions(-) create mode 100644 apps/generator-cli/src/app/helpers/index.ts diff --git a/apps/generator-cli/src/app/helpers/index.ts b/apps/generator-cli/src/app/helpers/index.ts new file mode 100644 index 000000000..6e40a7907 --- /dev/null +++ b/apps/generator-cli/src/app/helpers/index.ts @@ -0,0 +1,7 @@ +/** + * If JAVA_HOME is set, it returns `$JAVA_HOME/bin/java` + * otherwise it returns `java` and it has to be in the `PATH` + */ +export const javaCmd: string = process.env['JAVA_HOME'] + ? `"${process.env['JAVA_HOME']}/bin/java"` + : 'java'; diff --git a/apps/generator-cli/src/app/services/generator.service.spec.ts b/apps/generator-cli/src/app/services/generator.service.spec.ts index 0bacfb344..e02e1eecc 100644 --- a/apps/generator-cli/src/app/services/generator.service.spec.ts +++ b/apps/generator-cli/src/app/services/generator.service.spec.ts @@ -1,6 +1,7 @@ import { Test } from '@nestjs/testing'; import { GeneratorService } from './generator.service'; import { LOGGER } from '../constants'; +import { javaCmd } from '../helpers'; import { VersionManagerService } from './version-manager.service'; import { ConfigService } from './config.service'; @@ -145,9 +146,6 @@ describe('GeneratorService', () => { )}`, }); - const javaHome = process.env['JAVA_HOME']; - const javaCmd = javaHome ? `${javaHome}/bin/java` : 'java'; - describe.each([ [ 'foo.json', diff --git a/apps/generator-cli/src/app/services/generator.service.ts b/apps/generator-cli/src/app/services/generator.service.ts index 2a6e3e70d..327f1d4de 100644 --- a/apps/generator-cli/src/app/services/generator.service.ts +++ b/apps/generator-cli/src/app/services/generator.service.ts @@ -10,6 +10,7 @@ import * as os from 'os'; import { VersionManagerService } from './version-manager.service'; import { ConfigService } from './config.service'; import { LOGGER } from '../constants'; +import { javaCmd } from '../helpers'; interface GeneratorConfig { glob: string; @@ -242,17 +243,10 @@ export class GeneratorService { )}" org.openapitools.codegen.OpenAPIGenerator` : `-jar "${cliPath}"`; - const javaHome = process.env['JAVA_HOME']; - const javaCmd = javaHome ? `${javaHome}/bin/java` : 'java'; - - return [ - javaCmd, - process.env['JAVA_OPTS'], - subCmd, - 'generate', - appendix, - ].filter(isString).join(' '); - } + return [javaCmd, process.env['JAVA_OPTS'], subCmd, 'generate', appendix] + .filter(isString) + .join(' '); + }; private isWin = () => process.platform === 'win32'; } diff --git a/apps/generator-cli/src/app/services/pass-through.service.spec.ts b/apps/generator-cli/src/app/services/pass-through.service.spec.ts index 09f01ade7..f81ed1436 100644 --- a/apps/generator-cli/src/app/services/pass-through.service.spec.ts +++ b/apps/generator-cli/src/app/services/pass-through.service.spec.ts @@ -2,6 +2,7 @@ import { Test } from '@nestjs/testing'; import chalk from 'chalk'; import { Command, createCommand } from 'commander'; import { COMMANDER_PROGRAM, LOGGER } from '../constants'; +import { javaCmd } from '../helpers'; import { GeneratorService } from './generator.service'; import { PassThroughService } from './pass-through.service'; import { VersionManagerService } from './version-manager.service'; @@ -192,7 +193,7 @@ describe('PassThroughService', () => { await program.parseAsync([name, ...argv], { from: 'user' }); expect(childProcess.spawn).toHaveBeenNthCalledWith( 1, - 'java -jar "/some/path/to/4.2.1.jar"', + `${javaCmd} -jar "/some/path/to/4.2.1.jar"`, [name, ...argv], { stdio: 'inherit', @@ -206,7 +207,7 @@ describe('PassThroughService', () => { await program.parseAsync([name, ...argv], { from: 'user' }); expect(childProcess.spawn).toHaveBeenNthCalledWith( 1, - 'java java-opt-1=1 -jar "/some/path/to/4.2.1.jar"', + `${javaCmd} java-opt-1=1 -jar "/some/path/to/4.2.1.jar"`, [name, ...argv], { stdio: 'inherit', @@ -224,7 +225,7 @@ describe('PassThroughService', () => { expect(childProcess.spawn).toHaveBeenNthCalledWith( 1, - `java -cp "${[ + `${javaCmd} -cp "${[ '/some/path/to/4.2.1.jar', '../some/custom.jar', ].join(cpDelimiter)}" org.openapitools.codegen.OpenAPIGenerator`, @@ -303,7 +304,7 @@ describe('PassThroughService', () => { it('spawns the correct process', () => { expect(childProcess.spawn).toHaveBeenNthCalledWith( 1, - 'java -jar "/some/path/to/4.2.1.jar"', + `${javaCmd} -jar "/some/path/to/4.2.1.jar"`, cmd.split(' '), { stdio: 'inherit', shell: true } ); diff --git a/apps/generator-cli/src/app/services/pass-through.service.ts b/apps/generator-cli/src/app/services/pass-through.service.ts index 304ec4824..3d6825e5a 100644 --- a/apps/generator-cli/src/app/services/pass-through.service.ts +++ b/apps/generator-cli/src/app/services/pass-through.service.ts @@ -4,6 +4,7 @@ import { exec, spawn } from 'child_process'; import { Command } from 'commander'; import { isString, startsWith, trim } from 'lodash'; import { COMMANDER_PROGRAM, LOGGER } from '../constants'; +import { javaCmd } from '../helpers'; import { GeneratorService } from './generator.service'; import { VersionManagerService } from './version-manager.service'; import { ConfigService } from './config.service'; @@ -142,7 +143,7 @@ export class PassThroughService { )}" org.openapitools.codegen.OpenAPIGenerator` : `-jar "${cliPath}"`; - return ['java', process.env['JAVA_OPTS'], subCmd] + return [javaCmd, process.env['JAVA_OPTS'], subCmd] .filter(isString) .join(' '); } From a5724ae5f556a53d56ba0c76775670f67c417fdf Mon Sep 17 00:00:00 2001 From: mok-liee <6745620+mok-liee@users.noreply.github.com> Date: Fri, 1 Mar 2024 00:13:34 +0100 Subject: [PATCH 5/5] fix: add quotation marks only for windows paths --- apps/generator-cli/src/app/helpers/index.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/generator-cli/src/app/helpers/index.ts b/apps/generator-cli/src/app/helpers/index.ts index 6e40a7907..ec8c11f00 100644 --- a/apps/generator-cli/src/app/helpers/index.ts +++ b/apps/generator-cli/src/app/helpers/index.ts @@ -1,7 +1,11 @@ +const isWin = () => process.platform === 'win32'; + /** * If JAVA_HOME is set, it returns `$JAVA_HOME/bin/java` * otherwise it returns `java` and it has to be in the `PATH` */ export const javaCmd: string = process.env['JAVA_HOME'] - ? `"${process.env['JAVA_HOME']}/bin/java"` + ? isWin() + ? `"${process.env['JAVA_HOME']}/bin/java"` + : `${process.env['JAVA_HOME']}/bin/java` : 'java';