3232import java .io .File ;
3333import java .io .IOException ;
3434import java .lang .module .Configuration ;
35+ import java .lang .module .FindException ;
3536import java .lang .module .ModuleDescriptor ;
3637import java .lang .module .ModuleFinder ;
3738import java .lang .module .ModuleReader ;
@@ -389,21 +390,29 @@ void processClassLoaderOptions() {
389390 }
390391
391392 processOption (NativeImageClassLoaderOptions .AddExports ).forEach (val -> {
392- if (val .targetModules .isEmpty ()) {
393- Modules .addExportsToAllUnnamed (val .module , val .packageName );
394- } else {
395- for (Module targetModule : val .targetModules ) {
396- Modules .addExports (val .module , val .packageName , targetModule );
393+ if (val .module .getPackages ().contains (val .packageName )) {
394+ if (val .targetModules .isEmpty ()) {
395+ Modules .addExportsToAllUnnamed (val .module , val .packageName );
396+ } else {
397+ for (Module targetModule : val .targetModules ) {
398+ Modules .addExports (val .module , val .packageName , targetModule );
399+ }
397400 }
401+ } else {
402+ warn ("package " + val .packageName + " not in " + val .module .getName ());
398403 }
399404 });
400405 processOption (NativeImageClassLoaderOptions .AddOpens ).forEach (val -> {
401- if (val .targetModules .isEmpty ()) {
402- Modules .addOpensToAllUnnamed (val .module , val .packageName );
403- } else {
404- for (Module targetModule : val .targetModules ) {
405- Modules .addOpens (val .module , val .packageName , targetModule );
406+ if (val .module .getPackages ().contains (val .packageName )) {
407+ if (val .targetModules .isEmpty ()) {
408+ Modules .addOpensToAllUnnamed (val .module , val .packageName );
409+ } else {
410+ for (Module targetModule : val .targetModules ) {
411+ Modules .addOpens (val .module , val .packageName , targetModule );
412+ }
406413 }
414+ } else {
415+ warn ("package " + val .packageName + " not in " + val .module .getName ());
407416 }
408417 });
409418 processOption (NativeImageClassLoaderOptions .AddReads ).forEach (val -> {
@@ -417,6 +426,10 @@ void processClassLoaderOptions() {
417426 });
418427 }
419428
429+ private static void warn (String m ) {
430+ LogUtils .warning ("WARNING" , m , true );
431+ }
432+
420433 private static void processListModulesOption (ModuleLayer layer ) {
421434 Class <?> launcherHelperClass = ReflectionUtil .lookupClass (false , "sun.launcher.LauncherHelper" );
422435 Method initOutputMethod = ReflectionUtil .lookupMethod (launcherHelperClass , "initOutput" , boolean .class );
@@ -499,33 +512,20 @@ private Stream<AddExportsAndOpensAndReadsFormatValue> processOption(OptionKey<Ac
499512 Stream <AddExportsAndOpensAndReadsFormatValue > parsedOptions = valuesWithOrigins .flatMap (valWithOrig -> {
500513 try {
501514 return Stream .of (asAddExportsAndOpensAndReadsFormatValue (specificOption , valWithOrig ));
502- } catch (UserError .UserException e ) {
503- if (ModuleSupport .modulePathBuild && classpath ().isEmpty ()) {
504- throw e ;
505- } else {
506- /*
507- * Until we switch to always running the image-builder on module-path we have to
508- * be tolerant if invalid --add-exports -add-opens or --add-reads options are
509- * used. GR-30433
510- */
511- LogUtils .warning (e .getMessage ());
512- return Stream .empty ();
513- }
515+ } catch (FindException e ) {
516+ /*
517+ * Print a specially-formatted warning to be 100% compatible with the output of
518+ * `java` in this case.
519+ */
520+ LogUtils .warning ("WARNING" , e .getMessage (), true );
521+ return Stream .empty ();
514522 }
515523 });
516524 return parsedOptions ;
517525 }
518526
519- private static final class AddExportsAndOpensAndReadsFormatValue {
520- private final Module module ;
521- private final String packageName ;
522- private final List <Module > targetModules ;
523-
524- private AddExportsAndOpensAndReadsFormatValue (Module module , String packageName , List <Module > targetModules ) {
525- this .module = module ;
526- this .packageName = packageName ;
527- this .targetModules = targetModules ;
528- }
527+ private record AddExportsAndOpensAndReadsFormatValue (Module module , String packageName ,
528+ List <Module > targetModules ) {
529529 }
530530
531531 private AddExportsAndOpensAndReadsFormatValue asAddExportsAndOpensAndReadsFormatValue (OptionKey <?> option , Pair <String , OptionOrigin > valueOrigin ) {
@@ -581,15 +581,15 @@ private AddExportsAndOpensAndReadsFormatValue asAddExportsAndOpensAndReadsFormat
581581 }
582582
583583 Module module = findModule (moduleName ).orElseThrow (() -> {
584- return userErrorAddExportsAndOpensAndReads (option , optionOrigin , optionValue , " Specified module '" + moduleName + "' is unknown." );
584+ throw userWarningModuleNotFound (option , moduleName );
585585 });
586586 List <Module > targetModules ;
587587 if (targetModuleNamesList .contains ("ALL-UNNAMED" )) {
588588 targetModules = Collections .emptyList ();
589589 } else {
590590 targetModules = targetModuleNamesList .stream ().map (mn -> {
591591 return findModule (mn ).orElseThrow (() -> {
592- throw userErrorAddExportsAndOpensAndReads (option , optionOrigin , optionValue , " Specified target-module '" + mn + "' is unknown." );
592+ throw userWarningModuleNotFound (option , mn );
593593 });
594594 }).collect (Collectors .toList ());
595595 }
@@ -601,6 +601,11 @@ private static UserError.UserException userErrorAddExportsAndOpensAndReads(Optio
601601 return UserError .abort ("Invalid option %s provided by %s.%s" , SubstrateOptionsParser .commandArgument (option , value ), origin , detailMessage );
602602 }
603603
604+ private static FindException userWarningModuleNotFound (OptionKey <?> option , String moduleName ) {
605+ String optionName = SubstrateOptionsParser .commandArgument (option , "" );
606+ return new FindException ("Unknown module: " + moduleName + " specified to " + optionName );
607+ }
608+
604609 Class <?> loadClassFromModule (Module module , String className ) {
605610 assert isModuleClassLoader (classLoader , module .getClassLoader ()) : "Argument `module` is java.lang.Module from unknown ClassLoader" ;
606611 return Class .forName (module , className );
0 commit comments