647 p -> "auto", 648 (s, p) -> s 649 ); 650 651 @SuppressWarnings("unchecked") 652 public static final StandardBundlerParam<List<String>> APP_CDS_CLASS_ROOTS = 653 new StandardBundlerParam<>( 654 I18N.getString("param.com-app-cds-root.name"), 655 I18N.getString("param.com-app-cds-root.description"), 656 "commercial.AppCDS.classRoots", 657 (Class<List<String>>)((Object)List.class), 658 p -> Collections.singletonList(MAIN_CLASS.fetchFrom(p)), 659 (s, p) -> Arrays.asList(s.split("[ ,:]")) 660 ); 661 662 public static void extractMainClassInfoFromAppResources(Map<String, ? super Object> params) { 663 boolean hasMainClass = params.containsKey(MAIN_CLASS.getID()); 664 boolean hasMainJar = params.containsKey(MAIN_JAR.getID()); 665 boolean hasMainJarClassPath = params.containsKey(CLASSPATH.getID()); 666 boolean hasPreloader = params.containsKey(PRELOADER_CLASS.getID()); 667 boolean haMainModule = params.containsKey(JLinkBundlerHelper.MAIN_MODULE.getID()); 668 669 if (hasMainClass && hasMainJar && hasMainJarClassPath || haMainModule) { 670 return; 671 } 672 // it's a pair. The [0] is the srcdir [1] is the file relative to sourcedir 673 List<String[]> filesToCheck = new ArrayList<>(); 674 675 if (hasMainJar) { 676 RelativeFileSet rfs = MAIN_JAR.fetchFrom(params); 677 for (String s : rfs.getIncludedFiles()) { 678 filesToCheck.add(new String[]{rfs.getBaseDirectory().toString(), s}); 679 } 680 } else if (hasMainJarClassPath) { 681 for (String s : CLASSPATH.fetchFrom(params).split("\\s+")) { 682 if (APP_RESOURCES.fetchFrom(params) != null) { 683 filesToCheck.add(new String[] {APP_RESOURCES.fetchFrom(params).getBaseDirectory().toString(), s}); 684 } 685 } 686 } else { 687 List<RelativeFileSet> rfsl = APP_RESOURCES_LIST.fetchFrom(params); 688 if (rfsl == null || rfsl.isEmpty()) { 689 return; 690 } 691 for (RelativeFileSet rfs : rfsl) { 751 } 752 params.put(MAIN_JAR.getID(), new RelativeFileSet(new File(fnames[0]), new LinkedHashSet<>(Collections.singletonList(file)))); 753 } 754 if (!hasMainJarClassPath) { 755 String cp = attrs.getValue(Attributes.Name.CLASS_PATH); 756 params.put(CLASSPATH.getID(), cp == null ? "" : cp); 757 } 758 break; 759 } 760 } 761 } catch (IOException ignore) { 762 ignore.printStackTrace(); 763 } 764 } 765 } 766 767 public static void validateMainClassInfoFromAppResources(Map<String, ? super Object> params) throws ConfigException { 768 boolean hasMainClass = params.containsKey(MAIN_CLASS.getID()); 769 boolean hasMainJar = params.containsKey(MAIN_JAR.getID()); 770 boolean hasMainJarClassPath = params.containsKey(CLASSPATH.getID()); 771 boolean haMainModule = params.containsKey(JLinkBundlerHelper.MAIN_MODULE.getID()); 772 773 if (hasMainClass && hasMainJar && hasMainJarClassPath || haMainModule) { 774 return; 775 } 776 777 extractMainClassInfoFromAppResources(params); 778 779 if (!params.containsKey(MAIN_CLASS.getID())) { 780 if (hasMainJar) { 781 throw new ConfigException( 782 MessageFormat.format(I18N.getString("error.no-main-class-with-main-jar"), 783 MAIN_JAR.fetchFrom(params)), 784 MessageFormat.format(I18N.getString("error.no-main-class-with-main-jar.advice"), 785 MAIN_JAR.fetchFrom(params))); 786 } else if (hasMainJarClassPath) { 787 throw new ConfigException( 788 I18N.getString("error.no-main-class-with-classpath"), 789 I18N.getString("error.no-main-class-with-classpath.advice")); 790 } else { 791 throw new ConfigException( 792 I18N.getString("error.no-main-class"), 793 I18N.getString("error.no-main-class.advice")); | 647 p -> "auto", 648 (s, p) -> s 649 ); 650 651 @SuppressWarnings("unchecked") 652 public static final StandardBundlerParam<List<String>> APP_CDS_CLASS_ROOTS = 653 new StandardBundlerParam<>( 654 I18N.getString("param.com-app-cds-root.name"), 655 I18N.getString("param.com-app-cds-root.description"), 656 "commercial.AppCDS.classRoots", 657 (Class<List<String>>)((Object)List.class), 658 p -> Collections.singletonList(MAIN_CLASS.fetchFrom(p)), 659 (s, p) -> Arrays.asList(s.split("[ ,:]")) 660 ); 661 662 public static void extractMainClassInfoFromAppResources(Map<String, ? super Object> params) { 663 boolean hasMainClass = params.containsKey(MAIN_CLASS.getID()); 664 boolean hasMainJar = params.containsKey(MAIN_JAR.getID()); 665 boolean hasMainJarClassPath = params.containsKey(CLASSPATH.getID()); 666 boolean hasPreloader = params.containsKey(PRELOADER_CLASS.getID()); 667 boolean hasModule = params.containsKey(JLinkBundlerHelper.MODULE.getID()); 668 669 if (hasMainClass && hasMainJar && hasMainJarClassPath || hasModule) { 670 return; 671 } 672 673 // it's a pair. The [0] is the srcdir [1] is the file relative to sourcedir 674 List<String[]> filesToCheck = new ArrayList<>(); 675 676 if (hasMainJar) { 677 RelativeFileSet rfs = MAIN_JAR.fetchFrom(params); 678 for (String s : rfs.getIncludedFiles()) { 679 filesToCheck.add(new String[]{rfs.getBaseDirectory().toString(), s}); 680 } 681 } else if (hasMainJarClassPath) { 682 for (String s : CLASSPATH.fetchFrom(params).split("\\s+")) { 683 if (APP_RESOURCES.fetchFrom(params) != null) { 684 filesToCheck.add(new String[] {APP_RESOURCES.fetchFrom(params).getBaseDirectory().toString(), s}); 685 } 686 } 687 } else { 688 List<RelativeFileSet> rfsl = APP_RESOURCES_LIST.fetchFrom(params); 689 if (rfsl == null || rfsl.isEmpty()) { 690 return; 691 } 692 for (RelativeFileSet rfs : rfsl) { 752 } 753 params.put(MAIN_JAR.getID(), new RelativeFileSet(new File(fnames[0]), new LinkedHashSet<>(Collections.singletonList(file)))); 754 } 755 if (!hasMainJarClassPath) { 756 String cp = attrs.getValue(Attributes.Name.CLASS_PATH); 757 params.put(CLASSPATH.getID(), cp == null ? "" : cp); 758 } 759 break; 760 } 761 } 762 } catch (IOException ignore) { 763 ignore.printStackTrace(); 764 } 765 } 766 } 767 768 public static void validateMainClassInfoFromAppResources(Map<String, ? super Object> params) throws ConfigException { 769 boolean hasMainClass = params.containsKey(MAIN_CLASS.getID()); 770 boolean hasMainJar = params.containsKey(MAIN_JAR.getID()); 771 boolean hasMainJarClassPath = params.containsKey(CLASSPATH.getID()); 772 boolean hasModule = params.containsKey(JLinkBundlerHelper.MODULE.getID()); 773 774 if (hasMainClass && hasMainJar && hasMainJarClassPath || hasModule) { 775 return; 776 } 777 778 extractMainClassInfoFromAppResources(params); 779 780 if (!params.containsKey(MAIN_CLASS.getID())) { 781 if (hasMainJar) { 782 throw new ConfigException( 783 MessageFormat.format(I18N.getString("error.no-main-class-with-main-jar"), 784 MAIN_JAR.fetchFrom(params)), 785 MessageFormat.format(I18N.getString("error.no-main-class-with-main-jar.advice"), 786 MAIN_JAR.fetchFrom(params))); 787 } else if (hasMainJarClassPath) { 788 throw new ConfigException( 789 I18N.getString("error.no-main-class-with-classpath"), 790 I18N.getString("error.no-main-class-with-classpath.advice")); 791 } else { 792 throw new ConfigException( 793 I18N.getString("error.no-main-class"), 794 I18N.getString("error.no-main-class.advice")); |