8221641: Follow up code clean up for JDK-8221582 JDK-8200758-branch
authorherrick
Tue, 09 Apr 2019 10:57:04 -0400
branchJDK-8200758-branch
changeset 57314 23da9e6f446f
parent 57307 4948a1944cf9
child 57315 4f1efc26b577
8221641: Follow up code clean up for JDK-8221582 Reviewed-by: almatvee
src/jdk.jpackage/linux/classes/jdk/jpackage/internal/resources/LinuxResources.properties
src/jdk.jpackage/linux/classes/jdk/jpackage/internal/resources/LinuxResources_ja.properties
src/jdk.jpackage/linux/classes/jdk/jpackage/internal/resources/LinuxResources_zh_CN.properties
src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources.properties
src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_ja.properties
src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_zh_CN.properties
src/jdk.jpackage/share/classes/jdk/jpackage/internal/Arguments.java
src/jdk.jpackage/share/classes/jdk/jpackage/internal/DeployParams.java
src/jdk.jpackage/share/classes/jdk/jpackage/internal/RelativeFileSet.java
src/jdk.jpackage/share/classes/jdk/jpackage/internal/StandardBundlerParam.java
src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources.properties
src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources_ja.properties
src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources_zh_CN.properties
src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources.properties
src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_ja.properties
src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_zh_CN.properties
test/jdk/tools/jpackage/JPackageMissingArgumentsTest.java
test/jdk/tools/jpackage/createappimage/JPackageCreateAppImageErrorTest.java
test/jdk/tools/jpackage/createappimage/JPackageCreateAppImageMainClassErrorTest.java
test/jdk/tools/jpackage/createappimage/JPackageCreateAppImageModuleMainClassErrorTest.java
test/jdk/tools/jpackage/helpers/JPackageHelper.java
--- a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/resources/LinuxResources.properties	Fri Apr 05 11:24:44 2019 -0400
+++ b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/resources/LinuxResources.properties	Tue Apr 09 10:57:04 2019 -0400
@@ -45,7 +45,6 @@
 resource.rpm-spec-file=RPM spec file
 resource.rpm-init-script=RPM init script
 
-
 error.parameters-null=Parameters map is null.
 error.parameters-null.advice=Pass in a non-null parameters map.
 error.parameters-null=Parameters map is null.
@@ -69,11 +68,11 @@
 
 
 message.icon-not-png=The specified icon "{0}" is not a PNG file and will not be used.  The default icon will be used in it's place.
-message.test-for-tool=Test for [{0}]. Result\: {1}
-message.outputting-to-location=Generating DEB for installer to\: {0}
-message.output-to-location=Package (.deb) saved to\: {0}
+message.test-for-tool=Test for [{0}]. Result: {1}
+message.outputting-to-location=Generating DEB for installer to: {0}.
+message.output-to-location=Package (.deb) saved to: {0}.
 message.debs-like-licenses=Debian packages should specify a license.  The absence of a license will cause some linux distributions to complain about the quality of the application.
 message.one-shortcut-required=At least one type of shortcut is required. Enabling menu shortcut.
-message.outputting-bundle-location=Generating RPM for installer to\: {0}
-message.output-bundle-location=Package (.rpm) saved to\: {0}
+message.outputting-bundle-location=Generating RPM for installer to: {0}.
+message.output-bundle-location=Package (.rpm) saved to: {0}.
 message.creating-association-with-null-extension=Creating association with null extension.
--- a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/resources/LinuxResources_ja.properties	Fri Apr 05 11:24:44 2019 -0400
+++ b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/resources/LinuxResources_ja.properties	Tue Apr 09 10:57:04 2019 -0400
@@ -45,7 +45,6 @@
 resource.rpm-spec-file=RPM spec file
 resource.rpm-init-script=RPM init script
 
-
 error.parameters-null=Parameters map is null.
 error.parameters-null.advice=Pass in a non-null parameters map.
 error.parameters-null=Parameters map is null.
@@ -69,11 +68,11 @@
 
 
 message.icon-not-png=The specified icon "{0}" is not a PNG file and will not be used.  The default icon will be used in it's place.
-message.test-for-tool=Test for [{0}]. Result\: {1}
-message.outputting-to-location=Generating DEB for installer to\: {0}
-message.output-to-location=Package (.deb) saved to\: {0}
+message.test-for-tool=Test for [{0}]. Result: {1}
+message.outputting-to-location=Generating DEB for installer to: {0}.
+message.output-to-location=Package (.deb) saved to: {0}.
 message.debs-like-licenses=Debian packages should specify a license.  The absence of a license will cause some linux distributions to complain about the quality of the application.
 message.one-shortcut-required=At least one type of shortcut is required. Enabling menu shortcut.
-message.outputting-bundle-location=Generating RPM for installer to\: {0}
-message.output-bundle-location=Package (.rpm) saved to\: {0}
+message.outputting-bundle-location=Generating RPM for installer to: {0}.
+message.output-bundle-location=Package (.rpm) saved to: {0}.
 message.creating-association-with-null-extension=Creating association with null extension.
--- a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/resources/LinuxResources_zh_CN.properties	Fri Apr 05 11:24:44 2019 -0400
+++ b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/resources/LinuxResources_zh_CN.properties	Tue Apr 09 10:57:04 2019 -0400
@@ -45,7 +45,6 @@
 resource.rpm-spec-file=RPM spec file
 resource.rpm-init-script=RPM init script
 
-
 error.parameters-null=Parameters map is null.
 error.parameters-null.advice=Pass in a non-null parameters map.
 error.parameters-null=Parameters map is null.
@@ -69,11 +68,11 @@
 
 
 message.icon-not-png=The specified icon "{0}" is not a PNG file and will not be used.  The default icon will be used in it's place.
-message.test-for-tool=Test for [{0}]. Result\: {1}
-message.outputting-to-location=Generating DEB for installer to\: {0}
-message.output-to-location=Package (.deb) saved to\: {0}
+message.test-for-tool=Test for [{0}]. Result: {1}
+message.outputting-to-location=Generating DEB for installer to: {0}.
+message.output-to-location=Package (.deb) saved to: {0}.
 message.debs-like-licenses=Debian packages should specify a license.  The absence of a license will cause some linux distributions to complain about the quality of the application.
 message.one-shortcut-required=At least one type of shortcut is required. Enabling menu shortcut.
-message.outputting-bundle-location=Generating RPM for installer to\: {0}
-message.output-bundle-location=Package (.rpm) saved to\: {0}
+message.outputting-bundle-location=Generating RPM for installer to: {0}.
+message.output-bundle-location=Package (.rpm) saved to: {0}.
 message.creating-association-with-null-extension=Creating association with null extension.
--- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources.properties	Fri Apr 05 11:24:44 2019 -0400
+++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources.properties	Tue Apr 09 10:57:04 2019 -0400
@@ -27,13 +27,13 @@
 app.bundler.name=Mac Application Image
 app.bundler.description=A Directory based image of a mac Application with an optionally co-bundled JRE.  Used as a base for the Installer bundlers
 store.bundler.name=Mac App Store Ready Bundler
-store.bundler.description=Creates a binary bundle ready for deployment into the Mac App Store."
+store.bundler.description=Creates a binary bundle ready for deployment into the Mac App Store.
 dmg.bundler.name=DMG Installer
 dmg.bundler.description=Mac DMG Installer Bundle
 pkg.bundler.name=PKG Installer
 pkg.bundler.description=Mac PKG Installer Bundle.
 
-error.invalid-cfbundle-version=Invalid CFBundleVersion - ''{0}''
+error.invalid-cfbundle-version=Invalid CFBundleVersion: [{0}].
 error.invalid-cfbundle-version.advice=Set a compatible 'appVersion' or set a 'mac.CFBundleVersion'.  Valid versions are one to three integers separated by dots.
 error.explicit-sign-no-cert=Signature explicitly requested but no signing certificate specified.
 error.explicit-sign-no-cert.advice=Either specify a valid cert in 'mac.signing-key-developer-id-app' or unset 'signBundle' or set 'signBundle' to false.
@@ -45,8 +45,6 @@
 error.parameters-null.advice=Pass in a non-null parameters map.
 error.cannot-create-output-dir=Output directory {0} cannot be created.
 error.cannot-write-to-output-dir=Output directory {0} is not writable.
-error.no-system-runtime=Bundle Configured to use the System JRE
-error.no-system-runtime.advice=Do not set 'runtime' to null, either don't set it or set it to a valid value.
 error.must-sign-app-store=Mac App Store apps must be signed, and signing has been disabled by bundler configuration.
 error.must-sign-app-store.advice=Either unset 'signBundle' or set 'signBundle' to true.
 error.no-app-signing-key=No Mac App Store App Signing Key
@@ -73,35 +71,34 @@
 
 
 message.bundle-name-too-long-warning={0} is set to ''{1}'', which is longer than 16 characters.  For a better Mac experience consider shortening it.
-message.no-mac-jre-support=Currently Macs require a JDK to package
 message.null-classpath=Null app resources?
-message.preparing-info-plist=Preparing Info.plist\: {0}
+message.preparing-info-plist=Preparing Info.plist: {0}.
 message.icon-not-icns= The specified icon "{0}" is not an ICNS file and will not be used.  The default icon will be used in it's place.
 message.version-string-too-many-components=Version sting may have between 1 and 3 numbers: 1, 1.2, 1.2.3.
 message.version-string-first-number-not-zero=The first number in a CFBundleVersion cannot be zero or negative.
 message.version-string-no-negative-numbers=Negative numbers are not allowed in version strings.
 message.version-string-numbers-only=Version strings can consist of only numbers and up to two dots.
 message.creating-association-with-null-extension=Creating association with null extension.
-message.ignoring.symlink=Warning: codesign is skipping the symlink {0}
+message.ignoring.symlink=Warning: codesign is skipping the symlink {0}.
 message.keychain.error=Error: unable to get keychain list.
-message.building-bundle=Building Mac App Store Bundle for {0}
-mesasge.intermediate-bundle-location=Intermediate application bundle image\: {0}
-message.app-image-dir-does-not-exist=Specified application image directory {0}\: {1} does not exists
-message.app-image-dir-does-not-exist.advice=Confirm that the value for {0} exists
-message.could-not-retrieve-name=Could not retrieve gecos name
+message.building-bundle=Building Mac App Store Bundle for {0}.
+mesasge.intermediate-bundle-location=Intermediate application bundle image: {0}
+message.app-image-dir-does-not-exist=Specified application image directory {0}: {1} does not exists.
+message.app-image-dir-does-not-exist.advice=Confirm that the value for {0} exists.
+message.could-not-retrieve-name=Could not retrieve gecos name.
 message.app-image-requires-app-name=When using an external app image you must specify the app name.
 message.app-image-requires-app-name.advice=Set the app name via the -name CLI flag, the fx:application/@name ANT attribute, or via the 'appName' bundler argument.
 message.app-image-requires-identifier=When using an external app image you must specify the identifier.
 message.app-image-requires-identifier.advice=Set the identifier via the -appId CLI flag, the fx:application/@id ANT attribute, or via the 'identifier' bundler argument.
-message.building-dmg=Building DMG package for {0}
-message.running-script=Running shell script on application image [{0}]
-message.intermediate-image-location=[DEBUG] Intermediate application bundle image\: {0}
-message.preparing-dmg-setup=Preparing dmg setup\: {0}
-message.creating-dmg-file=Creating DMG file\: {0}
+message.building-dmg=Building DMG package for {0}.
+message.running-script=Running shell script on application image [{0}].
+message.intermediate-image-location=[DEBUG] Intermediate application bundle image: {0}.
+message.preparing-dmg-setup=Preparing dmg setup: {0}.
+message.creating-dmg-file=Creating DMG file: {0}.
 message.dmg-cannot-be-overwritten=Dmg file exists ({0} and can not be removed.
-message.output-to-location=Result DMG installer for {0}\: {1}
-message.building-pkg=Building PKG package for {0}
-message.preparing-scripts=Preparing package scripts
-message.preparing-distribution-dist=Preparing distribution.dist\: {0}
+message.output-to-location=Result DMG installer for {0}: {1}.
+message.building-pkg=Building PKG package for {0}.
+message.preparing-scripts=Preparing package scripts.
+message.preparing-distribution-dist=Preparing distribution.dist: {0}.
 message.signing.pkg=Warning: For signing PKG, you might need to set "Always Trust" for your certificate using "Keychain Access" tool.
 
--- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_ja.properties	Fri Apr 05 11:24:44 2019 -0400
+++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_ja.properties	Tue Apr 09 10:57:04 2019 -0400
@@ -27,13 +27,13 @@
 app.bundler.name=Mac Application Image
 app.bundler.description=A Directory based image of a mac Application with an optionally co-bundled JRE.  Used as a base for the Installer bundlers
 store.bundler.name=Mac App Store Ready Bundler
-store.bundler.description=Creates a binary bundle ready for deployment into the Mac App Store."
+store.bundler.description=Creates a binary bundle ready for deployment into the Mac App Store.
 dmg.bundler.name=DMG Installer
 dmg.bundler.description=Mac DMG Installer Bundle
 pkg.bundler.name=PKG Installer
 pkg.bundler.description=Mac PKG Installer Bundle.
 
-error.invalid-cfbundle-version=Invalid CFBundleVersion - ''{0}''
+error.invalid-cfbundle-version=Invalid CFBundleVersion: [{0}].
 error.invalid-cfbundle-version.advice=Set a compatible 'appVersion' or set a 'mac.CFBundleVersion'.  Valid versions are one to three integers separated by dots.
 error.explicit-sign-no-cert=Signature explicitly requested but no signing certificate specified.
 error.explicit-sign-no-cert.advice=Either specify a valid cert in 'mac.signing-key-developer-id-app' or unset 'signBundle' or set 'signBundle' to false.
@@ -45,8 +45,6 @@
 error.parameters-null.advice=Pass in a non-null parameters map.
 error.cannot-create-output-dir=Output directory {0} cannot be created.
 error.cannot-write-to-output-dir=Output directory {0} is not writable.
-error.no-system-runtime=Bundle Configured to use the System JRE
-error.no-system-runtime.advice=Do not set 'runtime' to null, either don't set it or set it to a valid value.
 error.must-sign-app-store=Mac App Store apps must be signed, and signing has been disabled by bundler configuration.
 error.must-sign-app-store.advice=Either unset 'signBundle' or set 'signBundle' to true.
 error.no-app-signing-key=No Mac App Store App Signing Key
@@ -73,35 +71,34 @@
 
 
 message.bundle-name-too-long-warning={0} is set to ''{1}'', which is longer than 16 characters.  For a better Mac experience consider shortening it.
-message.no-mac-jre-support=Currently Macs require a JDK to package
 message.null-classpath=Null app resources?
-message.preparing-info-plist=Preparing Info.plist\: {0}
+message.preparing-info-plist=Preparing Info.plist: {0}.
 message.icon-not-icns= The specified icon "{0}" is not an ICNS file and will not be used.  The default icon will be used in it's place.
 message.version-string-too-many-components=Version sting may have between 1 and 3 numbers: 1, 1.2, 1.2.3.
 message.version-string-first-number-not-zero=The first number in a CFBundleVersion cannot be zero or negative.
 message.version-string-no-negative-numbers=Negative numbers are not allowed in version strings.
 message.version-string-numbers-only=Version strings can consist of only numbers and up to two dots.
 message.creating-association-with-null-extension=Creating association with null extension.
-message.ignoring.symlink=Warning: codesign is skipping the symlink {0}
+message.ignoring.symlink=Warning: codesign is skipping the symlink {0}.
 message.keychain.error=Error: unable to get keychain list.
-message.building-bundle=Building Mac App Store Bundle for {0}
-mesasge.intermediate-bundle-location=Intermediate application bundle image\: {0}
-message.app-image-dir-does-not-exist=Specified application image directory {0}\: {1} does not exists
-message.app-image-dir-does-not-exist.advice=Confirm that the value for {0} exists
-message.could-not-retrieve-name=Could not retrieve gecos name
+message.building-bundle=Building Mac App Store Bundle for {0}.
+mesasge.intermediate-bundle-location=Intermediate application bundle image: {0}
+message.app-image-dir-does-not-exist=Specified application image directory {0}: {1} does not exists.
+message.app-image-dir-does-not-exist.advice=Confirm that the value for {0} exists.
+message.could-not-retrieve-name=Could not retrieve gecos name.
 message.app-image-requires-app-name=When using an external app image you must specify the app name.
 message.app-image-requires-app-name.advice=Set the app name via the -name CLI flag, the fx:application/@name ANT attribute, or via the 'appName' bundler argument.
 message.app-image-requires-identifier=When using an external app image you must specify the identifier.
 message.app-image-requires-identifier.advice=Set the identifier via the -appId CLI flag, the fx:application/@id ANT attribute, or via the 'identifier' bundler argument.
-message.building-dmg=Building DMG package for {0}
-message.running-script=Running shell script on application image [{0}]
-message.intermediate-image-location=[DEBUG] Intermediate application bundle image\: {0}
-message.preparing-dmg-setup=Preparing dmg setup\: {0}
-message.creating-dmg-file=Creating DMG file\: {0}
+message.building-dmg=Building DMG package for {0}.
+message.running-script=Running shell script on application image [{0}].
+message.intermediate-image-location=[DEBUG] Intermediate application bundle image: {0}.
+message.preparing-dmg-setup=Preparing dmg setup: {0}.
+message.creating-dmg-file=Creating DMG file: {0}.
 message.dmg-cannot-be-overwritten=Dmg file exists ({0} and can not be removed.
-message.output-to-location=Result DMG installer for {0}\: {1}
-message.building-pkg=Building PKG package for {0}
-message.preparing-scripts=Preparing package scripts
-message.preparing-distribution-dist=Preparing distribution.dist\: {0}
+message.output-to-location=Result DMG installer for {0}: {1}.
+message.building-pkg=Building PKG package for {0}.
+message.preparing-scripts=Preparing package scripts.
+message.preparing-distribution-dist=Preparing distribution.dist: {0}.
 message.signing.pkg=Warning: For signing PKG, you might need to set "Always Trust" for your certificate using "Keychain Access" tool.
 
--- a/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_zh_CN.properties	Fri Apr 05 11:24:44 2019 -0400
+++ b/src/jdk.jpackage/macosx/classes/jdk/jpackage/internal/resources/MacResources_zh_CN.properties	Tue Apr 09 10:57:04 2019 -0400
@@ -27,13 +27,13 @@
 app.bundler.name=Mac Application Image
 app.bundler.description=A Directory based image of a mac Application with an optionally co-bundled JRE.  Used as a base for the Installer bundlers
 store.bundler.name=Mac App Store Ready Bundler
-store.bundler.description=Creates a binary bundle ready for deployment into the Mac App Store."
+store.bundler.description=Creates a binary bundle ready for deployment into the Mac App Store.
 dmg.bundler.name=DMG Installer
 dmg.bundler.description=Mac DMG Installer Bundle
 pkg.bundler.name=PKG Installer
 pkg.bundler.description=Mac PKG Installer Bundle.
 
-error.invalid-cfbundle-version=Invalid CFBundleVersion - ''{0}''
+error.invalid-cfbundle-version=Invalid CFBundleVersion: [{0}].
 error.invalid-cfbundle-version.advice=Set a compatible 'appVersion' or set a 'mac.CFBundleVersion'.  Valid versions are one to three integers separated by dots.
 error.explicit-sign-no-cert=Signature explicitly requested but no signing certificate specified.
 error.explicit-sign-no-cert.advice=Either specify a valid cert in 'mac.signing-key-developer-id-app' or unset 'signBundle' or set 'signBundle' to false.
@@ -45,8 +45,6 @@
 error.parameters-null.advice=Pass in a non-null parameters map.
 error.cannot-create-output-dir=Output directory {0} cannot be created.
 error.cannot-write-to-output-dir=Output directory {0} is not writable.
-error.no-system-runtime=Bundle Configured to use the System JRE
-error.no-system-runtime.advice=Do not set 'runtime' to null, either don't set it or set it to a valid value.
 error.must-sign-app-store=Mac App Store apps must be signed, and signing has been disabled by bundler configuration.
 error.must-sign-app-store.advice=Either unset 'signBundle' or set 'signBundle' to true.
 error.no-app-signing-key=No Mac App Store App Signing Key
@@ -73,35 +71,34 @@
 
 
 message.bundle-name-too-long-warning={0} is set to ''{1}'', which is longer than 16 characters.  For a better Mac experience consider shortening it.
-message.no-mac-jre-support=Currently Macs require a JDK to package
 message.null-classpath=Null app resources?
-message.preparing-info-plist=Preparing Info.plist\: {0}
+message.preparing-info-plist=Preparing Info.plist: {0}.
 message.icon-not-icns= The specified icon "{0}" is not an ICNS file and will not be used.  The default icon will be used in it's place.
 message.version-string-too-many-components=Version sting may have between 1 and 3 numbers: 1, 1.2, 1.2.3.
 message.version-string-first-number-not-zero=The first number in a CFBundleVersion cannot be zero or negative.
 message.version-string-no-negative-numbers=Negative numbers are not allowed in version strings.
 message.version-string-numbers-only=Version strings can consist of only numbers and up to two dots.
 message.creating-association-with-null-extension=Creating association with null extension.
-message.ignoring.symlink=Warning: codesign is skipping the symlink {0}
+message.ignoring.symlink=Warning: codesign is skipping the symlink {0}.
 message.keychain.error=Error: unable to get keychain list.
-message.building-bundle=Building Mac App Store Bundle for {0}
-mesasge.intermediate-bundle-location=Intermediate application bundle image\: {0}
-message.app-image-dir-does-not-exist=Specified application image directory {0}\: {1} does not exists
-message.app-image-dir-does-not-exist.advice=Confirm that the value for {0} exists
-message.could-not-retrieve-name=Could not retrieve gecos name
+message.building-bundle=Building Mac App Store Bundle for {0}.
+mesasge.intermediate-bundle-location=Intermediate application bundle image: {0}
+message.app-image-dir-does-not-exist=Specified application image directory {0}: {1} does not exists.
+message.app-image-dir-does-not-exist.advice=Confirm that the value for {0} exists.
+message.could-not-retrieve-name=Could not retrieve gecos name.
 message.app-image-requires-app-name=When using an external app image you must specify the app name.
 message.app-image-requires-app-name.advice=Set the app name via the -name CLI flag, the fx:application/@name ANT attribute, or via the 'appName' bundler argument.
 message.app-image-requires-identifier=When using an external app image you must specify the identifier.
 message.app-image-requires-identifier.advice=Set the identifier via the -appId CLI flag, the fx:application/@id ANT attribute, or via the 'identifier' bundler argument.
-message.building-dmg=Building DMG package for {0}
-message.running-script=Running shell script on application image [{0}]
-message.intermediate-image-location=[DEBUG] Intermediate application bundle image\: {0}
-message.preparing-dmg-setup=Preparing dmg setup\: {0}
-message.creating-dmg-file=Creating DMG file\: {0}
+message.building-dmg=Building DMG package for {0}.
+message.running-script=Running shell script on application image [{0}].
+message.intermediate-image-location=[DEBUG] Intermediate application bundle image: {0}.
+message.preparing-dmg-setup=Preparing dmg setup: {0}.
+message.creating-dmg-file=Creating DMG file: {0}.
 message.dmg-cannot-be-overwritten=Dmg file exists ({0} and can not be removed.
-message.output-to-location=Result DMG installer for {0}\: {1}
-message.building-pkg=Building PKG package for {0}
-message.preparing-scripts=Preparing package scripts
-message.preparing-distribution-dist=Preparing distribution.dist\: {0}
+message.output-to-location=Result DMG installer for {0}: {1}.
+message.building-pkg=Building PKG package for {0}.
+message.preparing-scripts=Preparing package scripts.
+message.preparing-distribution-dist=Preparing distribution.dist: {0}.
 message.signing.pkg=Warning: For signing PKG, you might need to set "Always Trust" for your certificate using "Keychain Access" tool.
 
--- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/Arguments.java	Fri Apr 05 11:24:44 2019 -0400
+++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/Arguments.java	Tue Apr 09 10:57:04 2019 -0400
@@ -719,7 +719,7 @@
     }
 
     private void addResources(DeployParams deployParams,
-            String inputdir) {
+            String inputdir) throws PackagerException {
 
         if (inputdir == null || inputdir.isEmpty()) {
             return;
@@ -728,9 +728,10 @@
         File baseDir = new File(inputdir);
 
         if (!baseDir.isDirectory()) {
-            Log.error(
-                    "Unable to add resources: \"--input\" is not a directory.");
-            return;
+            throw new PackagerException("ERR_InputNotDirectory", inputdir);
+        }
+        if (!baseDir.canRead()) {
+            throw new PackagerException("ERR_CannotReadInputDir", inputdir);
         }
 
         List<String> fileNames;
--- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/DeployParams.java	Fri Apr 05 11:24:44 2019 -0400
+++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/DeployParams.java	Tue Apr 09 10:57:04 2019 -0400
@@ -364,10 +364,6 @@
             if (resources.isEmpty()) {
                 throw new PackagerException("ERR_MissingAppResources");
             }
-            if (!hasClass) {
-                throw new PackagerException("ERR_MissingArgument",
-                        "--main-class");
-            }
             if (!hasMain) {
                 throw new PackagerException("ERR_MissingArgument",
                         "--main-jar");
--- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/RelativeFileSet.java	Fri Apr 05 11:24:44 2019 -0400
+++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/RelativeFileSet.java	Tue Apr 09 10:57:04 2019 -0400
@@ -107,8 +107,11 @@
 
     @Override
     public String toString() {
+        if (files.size() ==  1) {
+            return "" + basedir + File.pathSeparator + files;
+        }
         return "RelativeFileSet {basedir:" + basedir
-                + ", files: {" + files + ")}";
+                + ", files: {" + files + "}";
     }
 
 }
--- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/StandardBundlerParam.java	Fri Apr 05 11:24:44 2019 -0400
+++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/StandardBundlerParam.java	Tue Apr 09 10:57:04 2019 -0400
@@ -167,19 +167,33 @@
                     (s, p) -> s
             );
 
+    static final StandardBundlerParam<File> PREDEFINED_RUNTIME_IMAGE =
+            new StandardBundlerParam<>(
+                    Arguments.CLIOptions.PREDEFINED_RUNTIME_IMAGE.getId(),
+                    File.class,
+                    params -> null,
+                    (s, p) -> new File(s)
+            );
+
     static final StandardBundlerParam<String> APP_NAME =
             new StandardBundlerParam<>(
                     Arguments.CLIOptions.NAME.getId(),
                     String.class,
                     params -> {
                         String s = MAIN_CLASS.fetchFrom(params);
-                        if (s == null) return null;
-
-                        int idx = s.lastIndexOf(".");
-                        if (idx >= 0) {
-                            return s.substring(idx+1);
+                        if (s != null) {
+                            int idx = s.lastIndexOf(".");
+                            if (idx >= 0) {
+                                return s.substring(idx+1);
+                            }
+                            return s;
+                        } else if (isRuntimeInstaller(params)) {
+                            File f = PREDEFINED_RUNTIME_IMAGE.fetchFrom(params);
+                            if (f != null) {
+                                return f.getName();
+                            }
                         }
-                        return s;
+                        return null;
                     },
                     (s, p) -> s
             );
@@ -343,13 +357,6 @@
             params -> null,
             (s, p) -> new File(s));
 
-    static final StandardBundlerParam<File> PREDEFINED_RUNTIME_IMAGE =
-            new StandardBundlerParam<>(
-            Arguments.CLIOptions.PREDEFINED_RUNTIME_IMAGE.getId(),
-            File.class,
-            params -> null,
-            (s, p) -> new File(s));
-
     @SuppressWarnings("unchecked")
     static final StandardBundlerParam<List<Map<String, ? super Object>>> ADD_LAUNCHERS =
             new StandardBundlerParam<>(
@@ -718,17 +725,8 @@
             }
             mainJarFile = new File(mainJarValue);
             if (mainJarFile.exists()) {
-                // absolute path for main-jar may fail is only legal if
-                // path is within the appResourceRoot directory
-                try {
-                    return new RelativeFileSet(appResourcesRoot,
-                         new LinkedHashSet<>(Collections.singletonList(
-                         mainJarFile)));
-                } catch (Exception e) {
-                    // if not within, RelativeFileSet constructor throws a
-                    // RuntimeException, but the IllegalArgumentException
-                    // below contains a more explicit error message.
-                }
+                // absolute path for main-jar may fail is not legal
+                // below contains explicit error message.
             } else {
                 List<Path> modulePath = MODULE_PATH.fetchFrom(params);
                 modulePath.removeAll(getDefaultModulePath());
--- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources.properties	Fri Apr 05 11:24:44 2019 -0400
+++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources.properties	Tue Apr 09 10:57:04 2019 -0400
@@ -30,44 +30,42 @@
 param.vendor.default=Unknown
 param.version.default=1.0
 
-message.using-default-resource=Using default package resource {0} {1} (add {2} to the resource-dir to customize)
-message.no-default-resource=no default package resource {0} {1} (add {2} to the resource-dir to customize)
-message.using-custom-resource-from-file=Using custom package resource {0} (loaded from file {1})
-message.using-custom-resource=Using custom package resource {0} (loaded from {1})
-message.creating-app-bundle=Creating app bundle\: {0} in {1}
-message.detected.modules="Automatically adding detected modules: {0}."
-message.modules="Adding modules: {0} to runtime image."
-message.app-image-dir-does-not-exist=Specified application image directory {0}\: {1} does not exists
-message.app-image-dir-does-not-exist.advice=Confirm that the value for {0} exists
-message.runtime-image-dir-does-not-exist=Specified runtime image directory {0}\: {1} does not exists
-message.runtime-image-dir-does-not-exist.advice=Confirm that the value for {0} exists
-message.debug-working-directory=Kept working directory for debug\: {0}
-message.bundle-created=Succeeded in building {0} bundle
+message.using-default-resource=Using default package resource {0} {1} (add {2} to the resource-dir to customize).
+message.no-default-resource=no default package resource {0} {1} (add {2} to the resource-dir to customize).
+message.using-custom-resource-from-file=Using custom package resource {0} (loaded from file {1}).
+message.using-custom-resource=Using custom package resource {0} (loaded from {1}).
+message.creating-app-bundle=Creating app bundle: {0} in {1}.
+message.detected.modules=Automatically adding detected modules: {0}.
+message.modules=Adding modules: {0} to runtime image.
+message.app-image-dir-does-not-exist=Specified application image directory {0}: {1} does not exists.
+message.app-image-dir-does-not-exist.advice=Confirm that the value for {0} exists.
+message.runtime-image-dir-does-not-exist=Specified runtime image directory {0}: {1} does not exists.
+message.runtime-image-dir-does-not-exist.advice=Confirm that the value for {0} exists.
+message.debug-working-directory=Kept working directory for debug: {0}.
+message.bundle-created=Succeeded in building {0} bundle.
 
 error.cannot-create-output-dir=Output directory {0} cannot be created.
 error.cannot-write-to-output-dir=Output directory {0} is not writable.
-error.root-exists=Error: Application output directory {0} already exists
+error.root-exists=Error: Application output directory {0} already exists.
 error.no-application-class=Main application class is missing.
 error.no-application-class.advice=Please specify main application class.
-error.no-main-module=Main application module is missing.
-error.no-main-module.advice=Make sure to use fx\:module task to create modular application.
-error.no-main-class-with-main-jar=An application class was not specified nor was one found in the jar {0}
-error.no-main-class-with-main-jar.advice=Please specify a application class or ensure that the jar {0} specifies one in the manifest.
-error.no-main-class=An application class was not specified nor was one found in the supplied application resources
+error.no-main-class-with-main-jar=A main class was not specified nor was one found in the jar {0}.
+error.no-main-class-with-main-jar.advice=Specify a main class or ensure that the jar {0} specifies one in the manifest.
+error.no-main-class=A main class was not specified nor was one found in the supplied application resources.
 error.no-main-class.advice=Please specify a application class or ensure that the appResources has a jar containing one in the manifest.
-error.main-jar-does-not-exist=The configured main jar does not exist {0}
-error.main-jar-does-not-exist.advice=The main jar must be specified relative to the app resources (not an absolute path), and must exist within those resources.
+error.main-jar-does-not-exist=The configured main jar does not exist {0} in the input directory.
+error.main-jar-does-not-exist.advice=The main jar must be specified relative to the input directory (not an absolute path), and must exist within that directory.
 
 warning.module.does.not.exist=Module [{0}] does not exist.
 warning.no.jdk.modules.found=Warning: No JDK Modules found.
-warning.missing.arg.file=Warning: Missing argument file: {0}
+warning.missing.arg.file=Warning: Missing argument file: {0}.
 
 MSG_BundlerFailed=Error: Bundler "{1}" ({0}) failed to produce a bundle.
 MSG_BundlerPlatformException=Bundler {0} skipped because the bundler does not support bundling on this platform.
-MSG_BundlerConfigException=Bundler {0} skipped because of a configuration problem\: {1}  \n\
-Advice to fix\: {2}
-MSG_BundlerConfigExceptionNoAdvice=Bundler {0} skipped because of a configuration problem\: {1}
-MSG_BundlerRuntimeException=Bundler {0} failed because of {1}
+MSG_BundlerConfigException=Bundler {0} skipped because of a configuration problem: {1}. \n\
+Advice to fix: {2}
+MSG_BundlerConfigExceptionNoAdvice=Bundler {0} skipped because of a configuration problem: {1}.
+MSG_BundlerRuntimeException=Bundler {0} failed because of {1}.
 MSG_Version=jpackage version
 MSG_BundlerFailed=Error: Bundler "{1}" ({0}) failed to produce a bundle.
 
@@ -75,14 +73,14 @@
 
 ERR_UnsupportedOption=Error: Option [{0}] is not valid on this platform.
 ERR_NotImageOption=Error: Option [{0}] is not valid in create-app-image mode.
-ERR_NotInstallerOption=Error: Option [{0}] is not valid with --app-image option
+ERR_NotInstallerOption=Error: Option [{0}] is not valid with --app-image option.
 ERR_NoInstallerEntryPoint=Error: Option [{0}] is not valid without --module or --main-jar entry point option.
 
-ERR_MissingMode=Error: Mode is not specified
-ERR_MissingArgument=Error: Missing argument: {0}
-ERR_MissingAppResources=Error: No application jars found
-ERR_AppImageNotExist=Error: App image directory "{0}" does not exist
-ERR_AppImageInvalid=Error: App image directory "{0}" does not contain "app" sub-directory
+ERR_MissingMode=Error: Mode is not specified.
+ERR_MissingArgument=Error: Missing argument: {0}.
+ERR_MissingAppResources=Error: No application jars found.
+ERR_AppImageNotExist=Error: App image directory "{0}" does not exist.
+ERR_AppImageInvalid=Error: App image directory "{0}" does not contain "app" sub-directory.
 ERR_NoAddLauncherName=Error: Add Launchers require a name parameter.
 ERR_NoUniqueName=Error: Add Launchers require a unique name parameter.
 ERR_NoJreInstallerName=Error: Jre Installers require a name parameter.
@@ -90,8 +88,10 @@
 ERR_InvalidSLName=Error: Invalid Add Launcher name: {0}.
 ERR_LicenseFileNotExit=Error: Specified license file does not exist.
 ERR_BuildRootInvalid=Error: temp-root ({0}) must be non-existant directory.
-ERR_InvalidOption=Error: Invalid Option: [{0}]
+ERR_InvalidOption=Error: Invalid Option: [{0}].
 ERR_VersionComparison=Error: Failed to compare version {0} with {1}.
 ERR_InvalidInstallerType=Error: Invalid or Unsupported Installer type: [{0}].
-ERR_BothMainJarAndModule="Error: Cannot have both --main-jar and --module Options"
-ERR_NoEntryPoint="Error: create-app-image requires --main-jar or --module Option"
+ERR_BothMainJarAndModule=Error: Cannot have both --main-jar and --module Options.
+ERR_NoEntryPoint=Error: create-app-image requires --main-jar or --module Option.
+ERR_InputNotDirectory=Error: Input directory specified is not a directory: {0}.
+ERR_CannotReadInputDir=Error: No permission to read from input directory: {0}.
--- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources_ja.properties	Fri Apr 05 11:24:44 2019 -0400
+++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources_ja.properties	Tue Apr 09 10:57:04 2019 -0400
@@ -30,44 +30,42 @@
 param.vendor.default=Unknown
 param.version.default=1.0
 
-message.using-default-resource=Using default package resource {0} {1} (add {2} to the resource-dir to customize)
-message.no-default-resource=no default package resource {0} {1} (add {2} to the resource-dir to customize)
-message.using-custom-resource-from-file=Using custom package resource {0} (loaded from file {1})
-message.using-custom-resource=Using custom package resource {0} (loaded from {1})
-message.creating-app-bundle=Creating app bundle\: {0} in {1}
-message.detected.modules="Automatically adding detected modules: {0}."
-message.modules="Adding modules: {0} to runtime image."
-message.app-image-dir-does-not-exist=Specified application image directory {0}\: {1} does not exists
-message.app-image-dir-does-not-exist.advice=Confirm that the value for {0} exists
-message.runtime-image-dir-does-not-exist=Specified runtime image directory {0}\: {1} does not exists
-message.runtime-image-dir-does-not-exist.advice=Confirm that the value for {0} exists
-message.debug-working-directory=Kept working directory for debug\: {0}
-message.bundle-created=Succeeded in building {0} bundle
+message.using-default-resource=Using default package resource {0} {1} (add {2} to the resource-dir to customize).
+message.no-default-resource=no default package resource {0} {1} (add {2} to the resource-dir to customize).
+message.using-custom-resource-from-file=Using custom package resource {0} (loaded from file {1}).
+message.using-custom-resource=Using custom package resource {0} (loaded from {1}).
+message.creating-app-bundle=Creating app bundle: {0} in {1}.
+message.detected.modules=Automatically adding detected modules: {0}.
+message.modules=Adding modules: {0} to runtime image.
+message.app-image-dir-does-not-exist=Specified application image directory {0}: {1} does not exists.
+message.app-image-dir-does-not-exist.advice=Confirm that the value for {0} exists.
+message.runtime-image-dir-does-not-exist=Specified runtime image directory {0}: {1} does not exists.
+message.runtime-image-dir-does-not-exist.advice=Confirm that the value for {0} exists.
+message.debug-working-directory=Kept working directory for debug: {0}.
+message.bundle-created=Succeeded in building {0} bundle.
 
 error.cannot-create-output-dir=Output directory {0} cannot be created.
 error.cannot-write-to-output-dir=Output directory {0} is not writable.
-error.root-exists=Error: Application output directory {0} already exists
+error.root-exists=Error: Application output directory {0} already exists.
 error.no-application-class=Main application class is missing.
 error.no-application-class.advice=Please specify main application class.
-error.no-main-module=Main application module is missing.
-error.no-main-module.advice=Make sure to use fx\:module task to create modular application.
-error.no-main-class-with-main-jar=An application class was not specified nor was one found in the jar {0}
-error.no-main-class-with-main-jar.advice=Please specify a application class or ensure that the jar {0} specifies one in the manifest.
-error.no-main-class=An application class was not specified nor was one found in the supplied application resources
+error.no-main-class-with-main-jar=A main class was not specified nor was one found in the jar {0}.
+error.no-main-class-with-main-jar.advice=Specify a main class or ensure that the jar {0} specifies one in the manifest.
+error.no-main-class=A main class was not specified nor was one found in the supplied application resources.
 error.no-main-class.advice=Please specify a application class or ensure that the appResources has a jar containing one in the manifest.
-error.main-jar-does-not-exist=The configured main jar does not exist {0}
-error.main-jar-does-not-exist.advice=The main jar must be specified relative to the app resources (not an absolute path), and must exist within those resources.
+error.main-jar-does-not-exist=The configured main jar does not exist {0} in the input directory.
+error.main-jar-does-not-exist.advice=The main jar must be specified relative to the input directory (not an absolute path), and must exist within that directory.
 
 warning.module.does.not.exist=Module [{0}] does not exist.
 warning.no.jdk.modules.found=Warning: No JDK Modules found.
-warning.missing.arg.file=Warning: Missing argument file: {0}
+warning.missing.arg.file=Warning: Missing argument file: {0}.
 
 MSG_BundlerFailed=Error: Bundler "{1}" ({0}) failed to produce a bundle.
 MSG_BundlerPlatformException=Bundler {0} skipped because the bundler does not support bundling on this platform.
-MSG_BundlerConfigException=Bundler {0} skipped because of a configuration problem\: {1}  \n\
-Advice to fix\: {2}
-MSG_BundlerConfigExceptionNoAdvice=Bundler {0} skipped because of a configuration problem\: {1}
-MSG_BundlerRuntimeException=Bundler {0} failed because of {1}
+MSG_BundlerConfigException=Bundler {0} skipped because of a configuration problem: {1}. \n\
+Advice to fix: {2}
+MSG_BundlerConfigExceptionNoAdvice=Bundler {0} skipped because of a configuration problem: {1}.
+MSG_BundlerRuntimeException=Bundler {0} failed because of {1}.
 MSG_Version=jpackage version
 MSG_BundlerFailed=Error: Bundler "{1}" ({0}) failed to produce a bundle.
 
@@ -75,14 +73,14 @@
 
 ERR_UnsupportedOption=Error: Option [{0}] is not valid on this platform.
 ERR_NotImageOption=Error: Option [{0}] is not valid in create-app-image mode.
-ERR_NotInstallerOption=Error: Option [{0}] is not valid with --app-image option
+ERR_NotInstallerOption=Error: Option [{0}] is not valid with --app-image option.
 ERR_NoInstallerEntryPoint=Error: Option [{0}] is not valid without --module or --main-jar entry point option.
 
-ERR_MissingMode=Error: Mode is not specified
-ERR_MissingArgument=Error: Missing argument: {0}
-ERR_MissingAppResources=Error: No application jars found
-ERR_AppImageNotExist=Error: App image directory "{0}" does not exist
-ERR_AppImageInvalid=Error: App image directory "{0}" does not contain "app" sub-directory
+ERR_MissingMode=Error: Mode is not specified.
+ERR_MissingArgument=Error: Missing argument: {0}.
+ERR_MissingAppResources=Error: No application jars found.
+ERR_AppImageNotExist=Error: App image directory "{0}" does not exist.
+ERR_AppImageInvalid=Error: App image directory "{0}" does not contain "app" sub-directory.
 ERR_NoAddLauncherName=Error: Add Launchers require a name parameter.
 ERR_NoUniqueName=Error: Add Launchers require a unique name parameter.
 ERR_NoJreInstallerName=Error: Jre Installers require a name parameter.
@@ -90,8 +88,10 @@
 ERR_InvalidSLName=Error: Invalid Add Launcher name: {0}.
 ERR_LicenseFileNotExit=Error: Specified license file does not exist.
 ERR_BuildRootInvalid=Error: temp-root ({0}) must be non-existant directory.
-ERR_InvalidOption=Error: Invalid Option: [{0}]
+ERR_InvalidOption=Error: Invalid Option: [{0}].
 ERR_VersionComparison=Error: Failed to compare version {0} with {1}.
 ERR_InvalidInstallerType=Error: Invalid or Unsupported Installer type: [{0}].
-ERR_BothMainJarAndModule="Error: Cannot have both --main-jar and --module Options"
-ERR_NoEntryPoint="Error: create-app-image requires --main-jar or --module Option"
+ERR_BothMainJarAndModule=Error: Cannot have both --main-jar and --module Options.
+ERR_NoEntryPoint=Error: create-app-image requires --main-jar or --module Option.
+ERR_InputNotDirectory=Error: Input directory specified is not a directory: {0}.
+ERR_CannotReadInputDir=Error: No permission to read from input directory: {0}.
--- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources_zh_CN.properties	Fri Apr 05 11:24:44 2019 -0400
+++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/resources/MainResources_zh_CN.properties	Tue Apr 09 10:57:04 2019 -0400
@@ -30,44 +30,42 @@
 param.vendor.default=Unknown
 param.version.default=1.0
 
-message.using-default-resource=Using default package resource {0} {1} (add {2} to the resource-dir to customize)
-message.no-default-resource=no default package resource {0} {1} (add {2} to the resource-dir to customize)
-message.using-custom-resource-from-file=Using custom package resource {0} (loaded from file {1})
-message.using-custom-resource=Using custom package resource {0} (loaded from {1})
-message.creating-app-bundle=Creating app bundle\: {0} in {1}
-message.detected.modules="Automatically adding detected modules: {0}."
-message.modules="Adding modules: {0} to runtime image."
-message.app-image-dir-does-not-exist=Specified application image directory {0}\: {1} does not exists
-message.app-image-dir-does-not-exist.advice=Confirm that the value for {0} exists
-message.runtime-image-dir-does-not-exist=Specified runtime image directory {0}\: {1} does not exists
-message.runtime-image-dir-does-not-exist.advice=Confirm that the value for {0} exists
-message.debug-working-directory=Kept working directory for debug\: {0}
-message.bundle-created=Succeeded in building {0} bundle
+message.using-default-resource=Using default package resource {0} {1} (add {2} to the resource-dir to customize).
+message.no-default-resource=no default package resource {0} {1} (add {2} to the resource-dir to customize).
+message.using-custom-resource-from-file=Using custom package resource {0} (loaded from file {1}).
+message.using-custom-resource=Using custom package resource {0} (loaded from {1}).
+message.creating-app-bundle=Creating app bundle: {0} in {1}.
+message.detected.modules=Automatically adding detected modules: {0}.
+message.modules=Adding modules: {0} to runtime image.
+message.app-image-dir-does-not-exist=Specified application image directory {0}: {1} does not exists.
+message.app-image-dir-does-not-exist.advice=Confirm that the value for {0} exists.
+message.runtime-image-dir-does-not-exist=Specified runtime image directory {0}: {1} does not exists.
+message.runtime-image-dir-does-not-exist.advice=Confirm that the value for {0} exists.
+message.debug-working-directory=Kept working directory for debug: {0}.
+message.bundle-created=Succeeded in building {0} bundle.
 
 error.cannot-create-output-dir=Output directory {0} cannot be created.
 error.cannot-write-to-output-dir=Output directory {0} is not writable.
-error.root-exists=Error: Application output directory {0} already exists
+error.root-exists=Error: Application output directory {0} already exists.
 error.no-application-class=Main application class is missing.
 error.no-application-class.advice=Please specify main application class.
-error.no-main-module=Main application module is missing.
-error.no-main-module.advice=Make sure to use fx\:module task to create modular application.
-error.no-main-class-with-main-jar=An application class was not specified nor was one found in the jar {0}
-error.no-main-class-with-main-jar.advice=Please specify a application class or ensure that the jar {0} specifies one in the manifest.
-error.no-main-class=An application class was not specified nor was one found in the supplied application resources
+error.no-main-class-with-main-jar=A main class was not specified nor was one found in the jar {0}.
+error.no-main-class-with-main-jar.advice=Specify a main class or ensure that the jar {0} specifies one in the manifest.
+error.no-main-class=A main class was not specified nor was one found in the supplied application resources.
 error.no-main-class.advice=Please specify a application class or ensure that the appResources has a jar containing one in the manifest.
-error.main-jar-does-not-exist=The configured main jar does not exist {0}
-error.main-jar-does-not-exist.advice=The main jar must be specified relative to the app resources (not an absolute path), and must exist within those resources.
+error.main-jar-does-not-exist=The configured main jar does not exist {0} in the input directory.
+error.main-jar-does-not-exist.advice=The main jar must be specified relative to the input directory (not an absolute path), and must exist within that directory.
 
 warning.module.does.not.exist=Module [{0}] does not exist.
 warning.no.jdk.modules.found=Warning: No JDK Modules found.
-warning.missing.arg.file=Warning: Missing argument file: {0}
+warning.missing.arg.file=Warning: Missing argument file: {0}.
 
 MSG_BundlerFailed=Error: Bundler "{1}" ({0}) failed to produce a bundle.
 MSG_BundlerPlatformException=Bundler {0} skipped because the bundler does not support bundling on this platform.
-MSG_BundlerConfigException=Bundler {0} skipped because of a configuration problem\: {1}  \n\
-Advice to fix\: {2}
-MSG_BundlerConfigExceptionNoAdvice=Bundler {0} skipped because of a configuration problem\: {1}
-MSG_BundlerRuntimeException=Bundler {0} failed because of {1}
+MSG_BundlerConfigException=Bundler {0} skipped because of a configuration problem: {1}. \n\
+Advice to fix: {2}
+MSG_BundlerConfigExceptionNoAdvice=Bundler {0} skipped because of a configuration problem: {1}.
+MSG_BundlerRuntimeException=Bundler {0} failed because of {1}.
 MSG_Version=jpackage version
 MSG_BundlerFailed=Error: Bundler "{1}" ({0}) failed to produce a bundle.
 
@@ -75,14 +73,14 @@
 
 ERR_UnsupportedOption=Error: Option [{0}] is not valid on this platform.
 ERR_NotImageOption=Error: Option [{0}] is not valid in create-app-image mode.
-ERR_NotInstallerOption=Error: Option [{0}] is not valid with --app-image option
+ERR_NotInstallerOption=Error: Option [{0}] is not valid with --app-image option.
 ERR_NoInstallerEntryPoint=Error: Option [{0}] is not valid without --module or --main-jar entry point option.
 
-ERR_MissingMode=Error: Mode is not specified
-ERR_MissingArgument=Error: Missing argument: {0}
-ERR_MissingAppResources=Error: No application jars found
-ERR_AppImageNotExist=Error: App image directory "{0}" does not exist
-ERR_AppImageInvalid=Error: App image directory "{0}" does not contain "app" sub-directory
+ERR_MissingMode=Error: Mode is not specified.
+ERR_MissingArgument=Error: Missing argument: {0}.
+ERR_MissingAppResources=Error: No application jars found.
+ERR_AppImageNotExist=Error: App image directory "{0}" does not exist.
+ERR_AppImageInvalid=Error: App image directory "{0}" does not contain "app" sub-directory.
 ERR_NoAddLauncherName=Error: Add Launchers require a name parameter.
 ERR_NoUniqueName=Error: Add Launchers require a unique name parameter.
 ERR_NoJreInstallerName=Error: Jre Installers require a name parameter.
@@ -90,8 +88,10 @@
 ERR_InvalidSLName=Error: Invalid Add Launcher name: {0}.
 ERR_LicenseFileNotExit=Error: Specified license file does not exist.
 ERR_BuildRootInvalid=Error: temp-root ({0}) must be non-existant directory.
-ERR_InvalidOption=Error: Invalid Option: [{0}]
+ERR_InvalidOption=Error: Invalid Option: [{0}].
 ERR_VersionComparison=Error: Failed to compare version {0} with {1}.
 ERR_InvalidInstallerType=Error: Invalid or Unsupported Installer type: [{0}].
-ERR_BothMainJarAndModule="Error: Cannot have both --main-jar and --module Options"
-ERR_NoEntryPoint="Error: create-app-image requires --main-jar or --module Option"
+ERR_BothMainJarAndModule=Error: Cannot have both --main-jar and --module Options.
+ERR_NoEntryPoint=Error: create-app-image requires --main-jar or --module Option.
+ERR_InputNotDirectory=Error: Input directory specified is not a directory: {0}.
+ERR_CannotReadInputDir=Error: No permission to read from input directory: {0}.
--- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources.properties	Fri Apr 05 11:24:44 2019 -0400
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources.properties	Tue Apr 09 10:57:04 2019 -0400
@@ -48,45 +48,43 @@
 error.cannot-create-output-dir=Output directory {0} cannot be created.
 error.cannot-write-to-output-dir=Output directory {0} is not writable.
 error.iscc-not-found=Can not find Inno Setup Compiler (iscc.exe).
-error.iscc-not-found.advice=Download Inno Setup 5 or later from http\://www.jrsoftware.org and add it to the PATH.
+error.iscc-not-found.advice=Download Inno Setup 5 or later from http://www.jrsoftware.org and add it to the PATH.
 error.copyright-is-too-long=The copyright string is too long for InnoSetup.
 error.copyright-is-too-long.advice=Provide a copyright string shorter than 100 characters.
 error.too-many-content-types-for-file-association=More than one MIME types was specified for File Association number {0}.
 error.too-many-content-types-for-file-association.advice=Specify one and only one MIME type for each file association.
 error.no-wix-tools=Can not find WiX tools (light.exe, candle.exe).
-error.no-wix-tools.advice=Download WiX 3.0 or later from http\://wix.sf.net and add it to the PATH.
+error.no-wix-tools.advice=Download WiX 3.0 or later from http://wix.sf.net and add it to the PATH.
 error.version-string-wrong-format=Version string is not compatible with MSI rules [{0}].
-error.version-string-wrong-format.advice=Set the bundler argument "{0}" according to these rules: http\://msdn.microsoft.com/en-us/library/aa370859%28v\=VS.85%29.aspx
-error.version-string-major-out-of-range=Major version must be in the range [0, 255]
-error.version-string-build-out-of-range=Build part of version must be in the range [0, 65535]
-error.version-string-minor-out-of-range=Minor version must be in the range [0, 255]
+error.version-string-wrong-format.advice=Set the bundler argument "{0}" according to these rules: http://msdn.microsoft.com/en-us/library/aa370859%28v\=VS.85%29.aspx .
+error.version-string-major-out-of-range=Major version must be in the range [0, 255].
+error.version-string-build-out-of-range=Build part of version must be in the range [0, 65535].
+error.version-string-minor-out-of-range=Minor version must be in the range [0, 255].
 error.version-string-part-not-number=Failed to convert version component to int.
-error.cannot-walk-directory=Can not walk [{0}] - it is not a valid directory
+error.cannot-walk-directory=Can not walk [{0}] - it is not a valid directory.
 error.version-swap=Failed to update version information for {0}.
 
-
-
-message.result-dir=Result application bundle\: {0}
+message.result-dir=Result application bundle: {0}.
 message.icon-not-ico=The specified icon "{0}" is not an ICO file and will not be used.  The default icon will be used in it's place.
 message.multiple-launchers=Multiple launchers found in predefined app-image.  {0} will be used as primary launcher.
 message.potential.windows.defender.issue=Warning: Windows Defender may prevent jpackage from functioning. If there is an issue, it can be addressed by either disabling realtime monitoring, or adding an exclusion for the directory "{0}".
 message.tool-wrong-version=Detected [{0}] version {1} but version {2} is required.
-message.outputting-to-location=Generating EXE for installer to\: {0}
-message.output-location=Installer (.exe) saved to\: {0}
-message.tool-version=\  Detected [{0}] version [{1}]
+message.outputting-to-location=Generating EXE for installer to: {0}.
+message.output-location=Installer (.exe) saved to: {0}
+message.tool-version=Detected [{0}] version [{1}].
 message.one-shortcut-required=At least one type of shortcut is required. Enabling menu shortcut.
-message.running-wsh-script=Running WSH script on application image [{0}]
-message.iscc-file-string=\  InnoSetup compiler set to {0}
+message.running-wsh-script=Running WSH script on application image [{0}].
+message.iscc-file-string=InnoSetup compiler set to {0}.
 message.creating-association-with-null-extension=Creating association with null extension.
 message.wrong-tool-version=Detected [{0}] version {1} but version {2} is required.
 message.version-string-too-many-components=Version sting may have up to 3 components - major.minor.build .
 message.truncating.id=Truncating Application ID to 126 chars for Inno Setup.
 message.use-wix36-features=WiX 3.6 detected. Enabling advanced cleanup action.
-message.generated-product-guid=Generated product GUID\: {0}
-message.preparing-msi-config=Preparing MSI config\: {0}
-message.generating-msi=Generating MSI\: {0}
-message.light-file-string=WiX light tool set to {0}
-message.candle-file-string=WiX candle tool set to {0}
+message.generated-product-guid=Generated product GUID: {0}.
+message.preparing-msi-config=Preparing MSI config: {0}.
+message.generating-msi=Generating MSI: {0}.
+message.light-file-string=WiX light tool set to {0}.
+message.candle-file-string=WiX candle tool set to {0}.
 message.install.dir.exist=The folder [APPLICATIONFOLDER] already exist. Whould you like to install to that folder anyway?
 message.invalid.install.dir=Warning: Invalid install directory {0}. Install directory should be a relative sub-path under the default installation location such as "Program Files". Defaulting to application name "{1}".
 
--- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_ja.properties	Fri Apr 05 11:24:44 2019 -0400
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_ja.properties	Tue Apr 09 10:57:04 2019 -0400
@@ -48,45 +48,43 @@
 error.cannot-create-output-dir=Output directory {0} cannot be created.
 error.cannot-write-to-output-dir=Output directory {0} is not writable.
 error.iscc-not-found=Can not find Inno Setup Compiler (iscc.exe).
-error.iscc-not-found.advice=Download Inno Setup 5 or later from http\://www.jrsoftware.org and add it to the PATH.
+error.iscc-not-found.advice=Download Inno Setup 5 or later from http://www.jrsoftware.org and add it to the PATH.
 error.copyright-is-too-long=The copyright string is too long for InnoSetup.
 error.copyright-is-too-long.advice=Provide a copyright string shorter than 100 characters.
 error.too-many-content-types-for-file-association=More than one MIME types was specified for File Association number {0}.
 error.too-many-content-types-for-file-association.advice=Specify one and only one MIME type for each file association.
 error.no-wix-tools=Can not find WiX tools (light.exe, candle.exe).
-error.no-wix-tools.advice=Download WiX 3.0 or later from http\://wix.sf.net and add it to the PATH.
+error.no-wix-tools.advice=Download WiX 3.0 or later from http://wix.sf.net and add it to the PATH.
 error.version-string-wrong-format=Version string is not compatible with MSI rules [{0}].
-error.version-string-wrong-format.advice=Set the bundler argument "{0}" according to these rules: http\://msdn.microsoft.com/en-us/library/aa370859%28v\=VS.85%29.aspx
-error.version-string-major-out-of-range=Major version must be in the range [0, 255]
-error.version-string-build-out-of-range=Build part of version must be in the range [0, 65535]
-error.version-string-minor-out-of-range=Minor version must be in the range [0, 255]
+error.version-string-wrong-format.advice=Set the bundler argument "{0}" according to these rules: http://msdn.microsoft.com/en-us/library/aa370859%28v\=VS.85%29.aspx .
+error.version-string-major-out-of-range=Major version must be in the range [0, 255].
+error.version-string-build-out-of-range=Build part of version must be in the range [0, 65535].
+error.version-string-minor-out-of-range=Minor version must be in the range [0, 255].
 error.version-string-part-not-number=Failed to convert version component to int.
-error.cannot-walk-directory=Can not walk [{0}] - it is not a valid directory
+error.cannot-walk-directory=Can not walk [{0}] - it is not a valid directory.
 error.version-swap=Failed to update version information for {0}.
 
-
-
-message.result-dir=Result application bundle\: {0}
+message.result-dir=Result application bundle: {0}.
 message.icon-not-ico=The specified icon "{0}" is not an ICO file and will not be used.  The default icon will be used in it's place.
 message.multiple-launchers=Multiple launchers found in predefined app-image.  {0} will be used as primary launcher.
 message.potential.windows.defender.issue=Warning: Windows Defender may prevent jpackage from functioning. If there is an issue, it can be addressed by either disabling realtime monitoring, or adding an exclusion for the directory "{0}".
 message.tool-wrong-version=Detected [{0}] version {1} but version {2} is required.
-message.outputting-to-location=Generating EXE for installer to\: {0}
-message.output-location=Installer (.exe) saved to\: {0}
-message.tool-version=\  Detected [{0}] version [{1}]
+message.outputting-to-location=Generating EXE for installer to: {0}.
+message.output-location=Installer (.exe) saved to: {0}
+message.tool-version=Detected [{0}] version [{1}].
 message.one-shortcut-required=At least one type of shortcut is required. Enabling menu shortcut.
-message.running-wsh-script=Running WSH script on application image [{0}]
-message.iscc-file-string=\  InnoSetup compiler set to {0}
+message.running-wsh-script=Running WSH script on application image [{0}].
+message.iscc-file-string=InnoSetup compiler set to {0}.
 message.creating-association-with-null-extension=Creating association with null extension.
 message.wrong-tool-version=Detected [{0}] version {1} but version {2} is required.
 message.version-string-too-many-components=Version sting may have up to 3 components - major.minor.build .
 message.truncating.id=Truncating Application ID to 126 chars for Inno Setup.
 message.use-wix36-features=WiX 3.6 detected. Enabling advanced cleanup action.
-message.generated-product-guid=Generated product GUID\: {0}
-message.preparing-msi-config=Preparing MSI config\: {0}
-message.generating-msi=Generating MSI\: {0}
-message.light-file-string=WiX light tool set to {0}
-message.candle-file-string=WiX candle tool set to {0}
+message.generated-product-guid=Generated product GUID: {0}.
+message.preparing-msi-config=Preparing MSI config: {0}.
+message.generating-msi=Generating MSI: {0}.
+message.light-file-string=WiX light tool set to {0}.
+message.candle-file-string=WiX candle tool set to {0}.
 message.install.dir.exist=The folder [APPLICATIONFOLDER] already exist. Whould you like to install to that folder anyway?
 message.invalid.install.dir=Warning: Invalid install directory {0}. Install directory should be a relative sub-path under the default installation location such as "Program Files". Defaulting to application name "{1}".
 
--- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_zh_CN.properties	Fri Apr 05 11:24:44 2019 -0400
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/resources/WinResources_zh_CN.properties	Tue Apr 09 10:57:04 2019 -0400
@@ -48,45 +48,43 @@
 error.cannot-create-output-dir=Output directory {0} cannot be created.
 error.cannot-write-to-output-dir=Output directory {0} is not writable.
 error.iscc-not-found=Can not find Inno Setup Compiler (iscc.exe).
-error.iscc-not-found.advice=Download Inno Setup 5 or later from http\://www.jrsoftware.org and add it to the PATH.
+error.iscc-not-found.advice=Download Inno Setup 5 or later from http://www.jrsoftware.org and add it to the PATH.
 error.copyright-is-too-long=The copyright string is too long for InnoSetup.
 error.copyright-is-too-long.advice=Provide a copyright string shorter than 100 characters.
 error.too-many-content-types-for-file-association=More than one MIME types was specified for File Association number {0}.
 error.too-many-content-types-for-file-association.advice=Specify one and only one MIME type for each file association.
 error.no-wix-tools=Can not find WiX tools (light.exe, candle.exe).
-error.no-wix-tools.advice=Download WiX 3.0 or later from http\://wix.sf.net and add it to the PATH.
+error.no-wix-tools.advice=Download WiX 3.0 or later from http://wix.sf.net and add it to the PATH.
 error.version-string-wrong-format=Version string is not compatible with MSI rules [{0}].
-error.version-string-wrong-format.advice=Set the bundler argument "{0}" according to these rules: http\://msdn.microsoft.com/en-us/library/aa370859%28v\=VS.85%29.aspx
-error.version-string-major-out-of-range=Major version must be in the range [0, 255]
-error.version-string-build-out-of-range=Build part of version must be in the range [0, 65535]
-error.version-string-minor-out-of-range=Minor version must be in the range [0, 255]
+error.version-string-wrong-format.advice=Set the bundler argument "{0}" according to these rules: http://msdn.microsoft.com/en-us/library/aa370859%28v\=VS.85%29.aspx .
+error.version-string-major-out-of-range=Major version must be in the range [0, 255].
+error.version-string-build-out-of-range=Build part of version must be in the range [0, 65535].
+error.version-string-minor-out-of-range=Minor version must be in the range [0, 255].
 error.version-string-part-not-number=Failed to convert version component to int.
-error.cannot-walk-directory=Can not walk [{0}] - it is not a valid directory
+error.cannot-walk-directory=Can not walk [{0}] - it is not a valid directory.
 error.version-swap=Failed to update version information for {0}.
 
-
-
-message.result-dir=Result application bundle\: {0}
+message.result-dir=Result application bundle: {0}.
 message.icon-not-ico=The specified icon "{0}" is not an ICO file and will not be used.  The default icon will be used in it's place.
 message.multiple-launchers=Multiple launchers found in predefined app-image.  {0} will be used as primary launcher.
 message.potential.windows.defender.issue=Warning: Windows Defender may prevent jpackage from functioning. If there is an issue, it can be addressed by either disabling realtime monitoring, or adding an exclusion for the directory "{0}".
 message.tool-wrong-version=Detected [{0}] version {1} but version {2} is required.
-message.outputting-to-location=Generating EXE for installer to\: {0}
-message.output-location=Installer (.exe) saved to\: {0}
-message.tool-version=\  Detected [{0}] version [{1}]
+message.outputting-to-location=Generating EXE for installer to: {0}.
+message.output-location=Installer (.exe) saved to: {0}
+message.tool-version=Detected [{0}] version [{1}].
 message.one-shortcut-required=At least one type of shortcut is required. Enabling menu shortcut.
-message.running-wsh-script=Running WSH script on application image [{0}]
-message.iscc-file-string=\  InnoSetup compiler set to {0}
+message.running-wsh-script=Running WSH script on application image [{0}].
+message.iscc-file-string=InnoSetup compiler set to {0}.
 message.creating-association-with-null-extension=Creating association with null extension.
 message.wrong-tool-version=Detected [{0}] version {1} but version {2} is required.
 message.version-string-too-many-components=Version sting may have up to 3 components - major.minor.build .
 message.truncating.id=Truncating Application ID to 126 chars for Inno Setup.
 message.use-wix36-features=WiX 3.6 detected. Enabling advanced cleanup action.
-message.generated-product-guid=Generated product GUID\: {0}
-message.preparing-msi-config=Preparing MSI config\: {0}
-message.generating-msi=Generating MSI\: {0}
-message.light-file-string=WiX light tool set to {0}
-message.candle-file-string=WiX candle tool set to {0}
+message.generated-product-guid=Generated product GUID: {0}.
+message.preparing-msi-config=Preparing MSI config: {0}.
+message.generating-msi=Generating MSI: {0}.
+message.light-file-string=WiX light tool set to {0}.
+message.candle-file-string=WiX candle tool set to {0}.
 message.install.dir.exist=The folder [APPLICATIONFOLDER] already exist. Whould you like to install to that folder anyway?
 message.invalid.install.dir=Warning: Invalid install directory {0}. Install directory should be a relative sub-path under the default installation location such as "Program Files". Defaulting to application name "{1}".
 
--- a/test/jdk/tools/jpackage/JPackageMissingArgumentsTest.java	Fri Apr 05 11:24:44 2019 -0400
+++ b/test/jdk/tools/jpackage/JPackageMissingArgumentsTest.java	Tue Apr 09 10:57:04 2019 -0400
@@ -59,7 +59,7 @@
         "--main-class", "Hello",
     };
 
-    private static final String [] RESULT_4 = {"--main-class"};
+    private static final String [] RESULT_4 = {"main class was not specified"};
     private static final String [] CMD_4 = {
         "create-app-image",
         "--input", "input",
@@ -94,10 +94,10 @@
         "--module", "com.hello/com.hello.Hello",
     };
 
-    private static void validate(String output, String [] expected)
-           throws Exception {
+    private static void validate(String output, String [] expected,
+           boolean single) throws Exception {
         String[] result = output.split("\n");
-        if (result.length != 1) {
+        if (single && result.length != 1) {
             System.err.println(output);
             throw new AssertionError("Invalid number of lines in output: "
                     + result.length);
@@ -114,48 +114,48 @@
 
     private static void testMissingArg() throws Exception {
         String output = JPackageHelper.executeCLI(false, CMD_1);
-        validate(output, RESULT_1);
+        validate(output, RESULT_1, true);
 
         output = JPackageHelper.executeCLI(false, CMD_2);
-        validate(output, RESULT_2);
+        validate(output, RESULT_2, true);
 
         output = JPackageHelper.executeCLI(false, CMD_3);
-        validate(output, RESULT_3);
+        validate(output, RESULT_3, true);
 
         output = JPackageHelper.executeCLI(false, CMD_4);
-        validate(output, RESULT_4);
+        validate(output, RESULT_4, false);
 
         output = JPackageHelper.executeCLI(false, CMD_5);
-        validate(output, RESULT_5);
+        validate(output, RESULT_5, true);
 
         output = JPackageHelper.executeCLI(false, CMD_6);
-        validate(output, RESULT_6);
+        validate(output, RESULT_6, true);
 
         output = JPackageHelper.executeCLI(false, CMD_7);
-        validate(output, RESULT_7);
+        validate(output, RESULT_7, true);
     }
 
     private static void testMissingArgToolProvider() throws Exception {
         String output = JPackageHelper.executeToolProvider(false, CMD_1);
-        validate(output, RESULT_1);
+        validate(output, RESULT_1, true);
 
         output = JPackageHelper.executeToolProvider(false, CMD_2);
-        validate(output, RESULT_2);
+        validate(output, RESULT_2, true);
 
         output = JPackageHelper.executeToolProvider(false, CMD_3);
-        validate(output, RESULT_3);
+        validate(output, RESULT_3, true);
 
         output = JPackageHelper.executeToolProvider(false, CMD_4);
-        validate(output, RESULT_4);
+        validate(output, RESULT_4, false);
 
         output = JPackageHelper.executeToolProvider(false, CMD_5);
-        validate(output, RESULT_5);
+        validate(output, RESULT_5, true);
 
         output = JPackageHelper.executeToolProvider(false, CMD_6);
-        validate(output, RESULT_6);
+        validate(output, RESULT_6, true);
 
         output = JPackageHelper.executeToolProvider(false, CMD_7);
-        validate(output, RESULT_7);
+        validate(output, RESULT_7, true);
     }
 
     public static void main(String[] args) throws Exception {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/tools/jpackage/createappimage/JPackageCreateAppImageErrorTest.java	Tue Apr 09 10:57:04 2019 -0400
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+ /*
+ * @test
+ * @summary jpackage create app image error test
+ * @library ../helpers
+ * @build JPackageHelper
+ * @build JPackagePath
+ * @build JPackageCreateAppImageBase
+ * @modules jdk.jpackage
+ * @run main/othervm -Xmx512m JPackageCreateAppImageErrorTest
+ */
+import java.util.*;
+import java.io.*;
+import java.nio.*;
+import java.nio.file.*;
+import java.nio.file.attribute.*;
+
+public class JPackageCreateAppImageErrorTest {
+
+    private static final String OUTPUT = "output";
+
+    private static final String ARG1 = "--no-such-argument";
+    private static final String EXPECTED1 =
+            "Invalid Option: [--no-such-argument]";
+    private static final String ARG2 = "--output";
+    private static final String EXPECTED2 = "Mode is not specified";
+
+    private static final String [] CMD1 = {
+        "create-app-image",
+        "--input", "input",
+        "--output", OUTPUT,
+        "--name", "test",
+        "--main-jar", "non-existant.jar",
+    };
+    private static final String EXP1 = "main jar does not exist";
+
+    private static final String [] CMD2 = {
+        "create-app-image",
+        "--input", "input",
+        "--output", OUTPUT,
+        "--name", "test",
+        "--main-jar", "hello.jar",
+    };
+    private static final String EXP2 = "class was not specified nor was";
+
+    private static void validate(String output, String expected, boolean single)
+            throws Exception {
+        String[] result = output.split("\n");
+        if (single && result.length != 1) {
+            System.err.println(output);
+            throw new AssertionError("Unexpected multiple lines of output: "
+                    + output);
+        }
+
+        if (!result[0].trim().contains(expected)) {
+            throw new AssertionError("Unexpected output: " + result[0]
+                    + " - expected output to contain: " + expected);
+        }
+    }
+
+
+    public static void main(String[] args) throws Exception {
+        JPackageHelper.createHelloImageJar();
+
+        validate(JPackageHelper.executeToolProvider(false, ARG1), EXPECTED1, true);
+        validate(JPackageHelper.executeToolProvider(false, ARG2), EXPECTED2, true);
+
+        JPackageHelper.deleteOutputFolder(OUTPUT);
+        validate(JPackageHelper.executeToolProvider(false, CMD1), EXP1, false);
+
+        JPackageHelper.deleteOutputFolder(OUTPUT);
+        validate(JPackageHelper.executeToolProvider(false, CMD2), EXP2, false);
+
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/tools/jpackage/createappimage/JPackageCreateAppImageMainClassErrorTest.java	Tue Apr 09 10:57:04 2019 -0400
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.File;
+import java.nio.file.Files;
+
+/*
+ * @test
+ * @summary jpackage create image with no main class arguments and with main-class attribute
+ * @library ../helpers
+ * @build JPackageHelper
+ * @build JPackagePath
+ * @modules jdk.jpackage
+ * @run main/othervm -Xmx512m JPackageCreateAppImageMainClassErrorTest
+ */
+public class JPackageCreateAppImageMainClassErrorTest {
+    private static final String OUTPUT = "output";
+    private static final String app = JPackagePath.getApp();
+    private static final String appOutput = JPackagePath.getAppOutputFile();
+    private static final String appWorkingDir = JPackagePath.getAppWorkingDir();
+
+    private static final String[] CMD = {
+        "create-app-image",
+        "--input", "input",
+        "--output", OUTPUT,
+        "--name", "test",
+        "--main-jar", "hello.jar"};
+
+    private static void validate(String output) throws Exception {
+        String[] result = output.split("\n");
+        if (result.length != 2) {
+            throw new AssertionError(
+                   "Unexpected number of lines: " + result.length);
+        }
+
+        if (!result[0].trim().contains("main class was not specified")) {
+            throw new AssertionError("Unexpected result[0]: " + result[0]);
+        }
+
+        if (!result[1].trim().startsWith("Advice to fix: ")) {
+            throw new AssertionError("Unexpected result[1]: " + result[1]);
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        JPackageHelper.createHelloImageJar();
+
+        JPackageHelper.deleteOutputFolder(OUTPUT);
+        validate(JPackageHelper.executeCLI(false, CMD));
+
+        JPackageHelper.deleteOutputFolder(OUTPUT);
+        validate(JPackageHelper.executeToolProvider(false, CMD));
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/tools/jpackage/createappimage/JPackageCreateAppImageModuleMainClassErrorTest.java	Tue Apr 09 10:57:04 2019 -0400
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import java.io.File;
+import java.nio.file.Files;
+
+/*
+ * @test
+ * @summary jpackage create image with no main class arguments and with main-class attribute
+ * @library ../helpers
+ * @build JPackageHelper
+ * @build JPackagePath
+ * @modules jdk.jpackage
+ * @run main/othervm -Xmx512m JPackageCreateAppImageModuleMainClassErrorTest
+ */
+public class JPackageCreateAppImageModuleMainClassErrorTest {
+    private static final String OUTPUT = "output";
+    private static final String app = JPackagePath.getApp();
+    private static final String appOutput = JPackagePath.getAppOutputFile();
+    private static final String appWorkingDir = JPackagePath.getAppWorkingDir();
+
+    private static final String [] CMD = {
+        "create-app-image",
+        "--output", OUTPUT,
+        "--name", "test",
+        "--module", "com.hello",
+        "--module-path", "input"};
+
+    private static void validate(String buildOutput) throws Exception {
+
+        File outfile = new File(appWorkingDir + File.separator + appOutput);
+        int retVal = JPackageHelper.execute(outfile, app);
+        if (retVal == 0) {
+            throw new AssertionError(
+                   "Test application exited without error: ");
+        }
+
+        if (!outfile.exists()) {
+            throw new AssertionError(appOutput + " was not created");
+        }
+        String output = Files.readString(outfile.toPath());
+        String[] result = output.split("\n");
+
+        if (result.length != 1) {
+            System.out.println("outfile (" + outfile + ") content: " + output);
+            throw new AssertionError(
+                   "Unexpected number of lines: " + result.length);
+        }
+
+        if (!result[0].trim().contains(
+                "does not have a ModuleMainClass attribute")) {
+            throw new AssertionError("Unexpected result[0]: " + result[0]);
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        JPackageHelper.createHelloModule();
+
+        JPackageHelper.deleteOutputFolder(OUTPUT);
+        validate(JPackageHelper.executeCLI(true, CMD));
+
+        JPackageHelper.deleteOutputFolder(OUTPUT);
+        validate(JPackageHelper.executeToolProvider(true, CMD));
+    }
+
+}
--- a/test/jdk/tools/jpackage/helpers/JPackageHelper.java	Fri Apr 05 11:24:44 2019 -0400
+++ b/test/jdk/tools/jpackage/helpers/JPackageHelper.java	Tue Apr 09 10:57:04 2019 -0400
@@ -153,7 +153,7 @@
         return command;
     }
 
-    private static void deleteRecursive(File path) throws IOException {
+    public static void deleteRecursive(File path) throws IOException {
         if (!path.exists()) {
             return;
         }
@@ -191,7 +191,13 @@
     public static void deleteOutputFolder(String output) throws IOException {
         File outputFolder = new File(output);
         System.out.println("AMDEBUG output: " + outputFolder.getAbsolutePath());
-        deleteRecursive(outputFolder);
+        try {
+            deleteRecursive(outputFolder);
+        } catch (IOException ioe) {
+            System.out.println("IOException: " + ioe);
+            ioe.printStackTrace();
+            deleteRecursive(outputFolder);
+        }
     }
 
     public static String executeCLI(boolean retValZero, String... args) throws Exception {
@@ -344,7 +350,8 @@
         createModule("Hello.java");
     }
 
-    private static void createModule(String javaFile) throws Exception {
+    private static void createModule(String javaFile)
+            throws Exception {
         int retVal;
 
         File input = new File("input");