1 /*
   2  * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package com.sun.javafx.tools.packager;
  27 
  28 import com.oracle.tools.packager.*;
  29 import com.oracle.tools.packager.ConfigException;
  30 import com.oracle.tools.packager.UnsupportedPlatformException;
  31 import com.sun.javafx.tools.packager.bundlers.Bundler.BundleType;
  32 
  33 import java.io.File;
  34 import java.io.FileInputStream;
  35 import java.io.IOException;
  36 import java.text.MessageFormat;
  37 import java.util.*;
  38 import java.util.stream.Stream;
  39 import java.nio.file.Files;
  40 import java.nio.file.Path;
  41 
  42 import jdk.packager.internal.JLinkBundlerHelper;
  43 
  44 
  45 public class Main {
  46 
  47     private static final ResourceBundle bundle =
  48             ResourceBundle.getBundle("com/sun/javafx/tools/packager/Bundle");
  49 
  50     private static final String version = bundle.getString("MSG_Version")
  51             + " " + PackagerLib.JAVAFX_VERSION + "\n";
  52     private static final String help = bundle.getString("MSG_Help_1")
  53                                         + bundle.getString("MSG_Help_2")
  54                                         + bundle.getString("MSG_Help_3")
  55                                         + bundle.getString("MSG_Help_4")
  56                                         + bundle.getString("MSG_Help_5")
  57                                         + bundle.getString("MSG_Help_6")
  58                                         + bundle.getString("MSG_Help_7");
  59 
  60     private static String nextArg(String args[], int i) {
  61         return (i == args.length - 1) ? "" : args[i + 1];
  62     }
  63 
  64     private static boolean verbose = false;
  65     private static boolean packageAsJar = false;
  66     private static boolean genJNLP = false;
  67     private static boolean genPackages = false;
  68     private static boolean css2Bin = false;
  69     private static boolean signJar = false;
  70     private static boolean makeAll = false;
  71 
  72     private static void addResources(CommonParams commonParams,
  73                                      String srcdir, String srcfiles) {
  74         if (srcdir == null || "".equals(srcdir)) {
  75             return;
  76         }
  77 
  78         File baseDir = new File(srcdir);
  79 
  80         if (!baseDir.isDirectory()) {
  81             Log.info("Unable to add resources: \"-srcdir\" is not a directory.");
  82             return;
  83         }
  84 
  85         List<String> fileNames;
  86         if (srcfiles != null) {
  87             fileNames = Arrays.asList(srcfiles.split(File.pathSeparator));
  88         } else {
  89             // "-srcfiles" is omitted, all files in srcdir (which
  90             // is a mandatory argument in this case) will be packed.
  91             fileNames = new ArrayList<>();
  92             try (Stream<Path> files = Files.list(baseDir.toPath())) {
  93                 files.forEach(file -> fileNames.add(file.getFileName().toString()));
  94             } catch (IOException e) {
  95                 Log.info("Unable to add resources: " + e.getMessage());
  96             }
  97         }
  98 
  99         fileNames.forEach(file -> commonParams.addResource(baseDir, file));
 100     }
 101 
 102     private static void addArgument(DeployParams deployParams, String argument) {
 103         if (deployParams.arguments != null) {
 104             deployParams.arguments.add(argument);
 105         } else {
 106             List<String> list = new LinkedList<>();
 107             list.add(argument);
 108             deployParams.setArguments(list);
 109         }
 110     }
 111 
 112     private static void addArgument(CreateJarParams deployParams, String argument) {
 113         if (deployParams.arguments != null) {
 114             deployParams.arguments.add(argument);
 115         } else {
 116             List<String> list = new LinkedList<>();
 117             list.add(argument);
 118             deployParams.setArguments(list);
 119         }
 120     }
 121 
 122     private static Map<String, String> createAttrMap(String arg) {
 123         Map<String, String> map = new HashMap<>();
 124         if (arg == null || "".equals(arg)) {
 125             return null;
 126         }
 127         String[] pairsArray = arg.split(",");
 128         for (String pair: pairsArray) {
 129             String[] attr = pair.split("=");
 130             map.put(attr[0].trim(), attr[1].trim());
 131         }
 132         return map;
 133     }
 134 
 135     private static List<Param> parseParams(String filename) throws IOException {
 136         File paramFile = new File(filename);
 137         Properties properties = new Properties();
 138         FileInputStream in = new FileInputStream(paramFile);
 139         properties.load(in);
 140         in.close();
 141 
 142         List<Param> parameters = new ArrayList<>(properties.size());
 143 
 144         for (Map.Entry en : properties.entrySet()) {
 145             Param p = new Param();
 146             p.setName((String)en.getKey());
 147             p.setValue((String)en.getValue());
 148             parameters.add(p);
 149         }
 150         return parameters;
 151     }
 152 
 153     private static List<HtmlParam> parseHtmlParams(String filename) throws IOException {
 154         File paramFile = new File(filename);
 155         Properties properties = new Properties();
 156         FileInputStream in = new FileInputStream(paramFile);
 157         properties.load(in);
 158         in.close();
 159 
 160         List<HtmlParam> parameters = new ArrayList<>(properties.size());
 161 
 162         for (Map.Entry en : properties.entrySet()) {
 163             HtmlParam p = new HtmlParam();
 164             p.setName((String)en.getKey());
 165             p.setValue((String)en.getValue());
 166             parameters.add(p);
 167         }
 168         return parameters;
 169     }
 170 
 171     private static List<JSCallback> parseCallbacks(String param) {
 172         String[] callbacks = param.split(",");
 173         List<JSCallback> list = new ArrayList<>(callbacks.length);
 174 
 175         for (String cb: callbacks) {
 176             String[] nameCmd = cb.split(":");
 177             if (nameCmd.length == 2) {
 178                 list.add(new JSCallback(nameCmd[0], nameCmd[1]));
 179             }
 180         }
 181         return list;
 182     }
 183 
 184 
 185     @SuppressWarnings("deprecation")
 186     public static void main(String... args) throws Exception {
 187         BundleType bundleType = BundleType.NONE;
 188 
 189         if (args.length == 0 || args.length == 1 && args[0].equals("-help")) {
 190             System.out.println(help);
 191         } else if (args.length == 1 && args[0].equals("-version")) {
 192             System.out.println(version);
 193         } else {
 194             PackagerLib packager = new PackagerLib();
 195             CreateJarParams createJarParams = new CreateJarParams();
 196             DeployParams deployParams = new DeployParams();
 197             CreateBSSParams createBssParams = new CreateBSSParams();
 198             SignJarParams signJarParams = new SignJarParams();
 199             MakeAllParams makeAllParams = new MakeAllParams();
 200             String srcdir = null;
 201             String srcfiles = null;
 202 
 203             try {
 204                 if (args[0].equalsIgnoreCase("-createjar")) {
 205                     for (int i = 1; i < args.length; i++) {
 206                         String arg = args[i];
 207                         if (arg.equalsIgnoreCase("-appclass")) {
 208                             createJarParams.setApplicationClass(nextArg(args, i++));
 209                         } else if (arg.equalsIgnoreCase("-preloader")) {
 210                             createJarParams.setPreloader(nextArg(args, i++));
 211                         } else if (arg.equalsIgnoreCase("-classpath")) {
 212                             createJarParams.setClasspath(nextArg(args, i++));
 213                         } else if (arg.equalsIgnoreCase("-manifestAttrs")) {
 214                             createJarParams.setManifestAttrs(createAttrMap(nextArg(args, i++)));
 215                         } else if (arg.equalsIgnoreCase("-noembedlauncher")) {
 216                             System.err.println("-noembedlauncher is deprecated");
 217                         } else if (arg.equalsIgnoreCase("-nocss2bin")) {
 218                             createJarParams.setCss2bin(false);
 219                         } else if (arg.equalsIgnoreCase("-runtimeVersion")) {
 220                             createJarParams.setFxVersion(nextArg(args, i++));
 221                             System.err.println("-runtimeVersion is deprecated");
 222                         } else if (arg.equalsIgnoreCase("-verbose") || arg.equalsIgnoreCase("-v")) {
 223                             createJarParams.setVerbose(true);
 224                             verbose = true;
 225                         } else if (arg.equalsIgnoreCase("-outdir")) {
 226                             createJarParams.setOutdir(new File(nextArg(args, i++)));
 227                         } else if (arg.equalsIgnoreCase("-outfile")) {
 228                             createJarParams.setOutfile(nextArg(args, i++));
 229                         } else if (arg.equalsIgnoreCase("-" + StandardBundlerParam.SOURCE_DIR.getID())) {
 230                             srcdir = nextArg(args, i++);
 231                         } else if (arg.equalsIgnoreCase("-srcfiles")) {
 232                             srcfiles = nextArg(args, i++);
 233                         } else if (arg.equalsIgnoreCase("-argument")) {
 234                             addArgument(createJarParams, nextArg(args, i++));
 235                         }  else if (arg.equalsIgnoreCase("-paramFile")) {
 236                             createJarParams.setParams(parseParams(nextArg(args, i++)));
 237                         } else {
 238                             throw new PackagerException("ERR_UnknownArgument", arg);
 239                         }
 240                     }
 241 
 242                     addResources(createJarParams, srcdir, srcfiles);
 243                     packageAsJar = true;
 244                 } else if (args[0].equalsIgnoreCase("-deploy")) {
 245                     File templateInFile = null;
 246                     File templateOutFile = null;
 247                     deployParams.setBundleType(BundleType.JNLP);
 248                     deployParams.setTargetFormat("jnlp");
 249 
 250                     //can only set it to true with command line, reset default
 251                     deployParams.setEmbedJNLP(false);
 252 
 253                     for (int i = 1; i < args.length; i++) {
 254                         String arg = args[i];
 255                         if (arg.startsWith("-B")) {
 256                             String key;
 257                             String value;
 258 
 259                             int keyStart = 2;
 260                             int equals = arg.indexOf("=");
 261                             int len = arg.length();
 262                             if (equals < keyStart) {
 263                                 if (keyStart < len) {
 264                                     key = arg.substring(keyStart, len);
 265                                     value = Boolean.TRUE.toString();
 266                                 } else {
 267                                     continue;
 268                                 }
 269                             } else if (keyStart < equals) {
 270                                 key = arg.substring(keyStart, equals);
 271                                 value = arg.substring(equals+1, len);
 272                             } else {
 273                                 continue;
 274                             }
 275                             deployParams.addBundleArgument(key, value);
 276                         } else if (arg.equalsIgnoreCase("-title")) {
 277                             deployParams.setTitle(nextArg(args, i++));
 278                         } else if (arg.equalsIgnoreCase("-vendor")) {
 279                             deployParams.setVendor(nextArg(args, i++));
 280                         } else if (arg.equalsIgnoreCase("-native")) {
 281                             bundleType = BundleType.NATIVE;
 282                             String format = null; //null means ANY
 283                             if (i+1 < args.length && !args[i+1].startsWith("-")) {
 284                                 String v = args[++i];
 285                                 com.sun.javafx.tools.packager.bundlers.Bundler.Bundle bundle =
 286                                         com.sun.javafx.tools.packager.bundlers.Bundler.stringToBundle(v);
 287                                 bundleType = bundle.type;
 288                                 format = bundle.format;
 289                             }
 290                             deployParams.setBundleType(bundleType);
 291                             deployParams.setTargetFormat(format);
 292                         } else if (arg.equalsIgnoreCase("-description")) {
 293                             deployParams.setDescription(nextArg(args, i++));
 294                         } else if(arg.equalsIgnoreCase("-appclass")) {
 295                             deployParams.setApplicationClass(nextArg(args, i++));
 296                         } else if(arg.equalsIgnoreCase("-daemon")) {
 297                             deployParams.setServiceHint(true);
 298                         } else if(arg.equalsIgnoreCase("-installdirChooser")) {
 299                             deployParams.setInstalldirChooser(true);
 300                         } else if (arg.equalsIgnoreCase("-preloader")) {
 301                             deployParams.setPreloader(nextArg(args, i++));
 302                         } else if (arg.equalsIgnoreCase("-paramFile")) {
 303                             deployParams.setParams(parseParams(nextArg(args, i++)));
 304                         } else if (arg.equalsIgnoreCase("-htmlParamFile")) {
 305                             deployParams.setHtmlParams(parseHtmlParams(nextArg(args, i++)));
 306                         } else if (arg.equalsIgnoreCase("-width")) {
 307                             deployParams.setWidth(Integer.parseInt(nextArg(args, i++)));
 308                         } else if (arg.equalsIgnoreCase("-height")) {
 309                             deployParams.setHeight(Integer.parseInt(nextArg(args, i++)));
 310                         } else if (arg.equalsIgnoreCase("-name")) {
 311                             deployParams.setAppName(nextArg(args, i++));
 312                         } else if (arg.equalsIgnoreCase("-embedJNLP")) {
 313                             deployParams.setEmbedJNLP(true);
 314                         } else if (arg.equalsIgnoreCase("-embedCertificates")) {
 315                             System.err.println("-embedCertificates is deprecated");
 316                         } else if (arg.equalsIgnoreCase("-allpermissions")) {
 317                             deployParams.setAllPermissions(true);
 318                         } else if (arg.equalsIgnoreCase("-updatemode")) {
 319                             deployParams.setUpdateMode(nextArg(args, i++));
 320                         } else if (arg.equalsIgnoreCase("-isExtension")) {
 321                             deployParams.setExtension(true);
 322                         } else if (arg.equalsIgnoreCase("-callbacks")) {
 323                             deployParams.setJSCallbacks(parseCallbacks(nextArg(args, i++)));
 324                         } else if (arg.equalsIgnoreCase("-templateInFilename")) {
 325                             templateInFile = new File(nextArg(args, i++));
 326                         } else if (arg.equalsIgnoreCase("-templateOutFilename")) {
 327                             templateOutFile = new File(nextArg(args, i++));
 328                         } else if (arg.equalsIgnoreCase("-appId") || arg.equalsIgnoreCase("-templateId")) {
 329                             String appIdArg = nextArg(args, i++);
 330                             deployParams.setAppId(appIdArg);
 331                             deployParams.setId(appIdArg);
 332                         } else if (arg.equalsIgnoreCase("-verbose") || arg.equalsIgnoreCase("-v")) {
 333                             deployParams.setVerbose(true);
 334                             verbose = true;
 335                         } else if (arg.equalsIgnoreCase("-includedt")) {
 336                             deployParams.setIncludeDT(true);
 337                         } else if (arg.equalsIgnoreCase("-outdir")) {
 338                             deployParams.setOutdir(new File(nextArg(args, i++)));
 339                         } else if (arg.equalsIgnoreCase("-outfile")) {
 340                             deployParams.setOutfile(nextArg(args, i++));
 341                         } else if (arg.equalsIgnoreCase("-" + StandardBundlerParam.SOURCE_DIR.getID())) {
 342                             srcdir = nextArg(args, i++);
 343                             deployParams.srcdir = srcdir;
 344                         } else if (arg.equalsIgnoreCase("-srcfiles")) {
 345                             srcfiles = nextArg(args, i++);
 346                         } else if (arg.equalsIgnoreCase("-argument")) {
 347                             addArgument(deployParams, nextArg(args, i++));
 348                         } else if (arg.equalsIgnoreCase("-nosign")) {
 349                             deployParams.setSignBundle(false);
 350                         } else if (arg.equals(ADD_MODULES)) {
 351                             deployParams.addAddModule(nextArg(args, i++));
 352                         } else if (arg.startsWith(ADD_MODULES + "=")) {
 353                             deployParams.addAddModule(arg.replace(ADD_MODULES + "=", ""));
 354                         } else if (arg.equals(LIMIT_MODULES)) {
 355                             deployParams.addLimitModule(nextArg(args, i++));
 356                         } else if (arg.startsWith(LIMIT_MODULES + "=")) {
 357                             deployParams.addLimitModule(arg.replace(LIMIT_MODULES + "=", ""));
 358                         } else if (arg.equals(STRIP_NATIVE_COMMANDS)) {
 359                             deployParams.setStripNativeCommands(Boolean.valueOf(nextArg(args, i++)));
 360                         } else if (arg.equals(STRIP_NATIVE_COMMANDS + "=")) {
 361                             deployParams.setStripNativeCommands(Boolean.valueOf(arg.replace(STRIP_NATIVE_COMMANDS + "=", "")));
 362                         } else if (arg.equals(DETECT_MODULES)) {
 363                             deployParams.setDetectModules(true);
 364                         } else if (arg.equals(MODULE_PATH) || arg.equals(P)) {
 365                             deployParams.modulePath = nextArg(args, i++);
 366                         } else if (arg.equals(MODULE_PATH + "=")) {
 367                             deployParams.modulePath = arg.replace(MODULE_PATH + "=", "");
 368                         } else if (arg.equals(MODULE) || arg.equals(M)) {
 369                             deployParams.setModule(nextArg(args, i++));
 370                         } else if (arg.equals(MODULE + "=")) {
 371                             deployParams.setModule(arg.replace(MODULE + "=", ""));
 372                         } else if (arg.startsWith(J_XDEBUG)) {
 373                             deployParams.setDebug(arg.replace(J_XDEBUG, ""));
 374                         } else {
 375                             throw new PackagerException("ERR_UnknownArgument", arg);
 376                         }
 377                     }
 378                     if (templateInFile != null) {
 379                         deployParams.addTemplate(templateInFile, templateOutFile);
 380                     }
 381 
 382                     if (deployParams.validateForJNLP()) {
 383                         genJNLP = true;
 384                     }
 385 
 386                     if (deployParams.validateForBundle()) {
 387                         genPackages = true;
 388                     }
 389 
 390                     addResources(deployParams, srcdir, srcfiles);
 391                 } else if (args[0].equalsIgnoreCase("-createbss")) {
 392                     for (int i = 1; i < args.length; i++) {
 393                         String arg = args[i];
 394                         if (arg.equalsIgnoreCase("-verbose") || arg.equalsIgnoreCase("-v")) {
 395                             createBssParams.setVerbose(true);
 396                             verbose = true;
 397                         } else if (arg.equalsIgnoreCase("-outdir")) {
 398                             createBssParams.setOutdir(new File(nextArg(args, i++)));
 399                         } else if (arg.equalsIgnoreCase("-srcdir")) {
 400                             srcdir = nextArg(args, i++);
 401                         } else if (arg.equalsIgnoreCase("-srcfiles")) {
 402                             srcfiles = nextArg(args, i++);
 403                         } else {
 404                             throw new PackagerException("ERR_UnknownArgument", arg);
 405                         }
 406                     }
 407 
 408                     addResources(createBssParams, srcdir, srcfiles);
 409                     css2Bin = true;
 410                 } else if (args[0].equalsIgnoreCase("-signJar")) {
 411                     for (int i = 1; i < args.length; i++) {
 412                         String arg = args[i];
 413                         if (arg.equalsIgnoreCase("-keyStore")) {
 414                             signJarParams.setKeyStore(new File(nextArg(args, i++)));
 415                         } else if(arg.equalsIgnoreCase("-alias")) {
 416                             signJarParams.setAlias(nextArg(args, i++));
 417                         } else if(arg.equalsIgnoreCase("-storePass")) {
 418                             signJarParams.setStorePass(nextArg(args, i++));
 419                         } else if(arg.equalsIgnoreCase("-keyPass")) {
 420                             signJarParams.setKeyPass(nextArg(args, i++));
 421                         } else if(arg.equalsIgnoreCase("-storeType")) {
 422                             signJarParams.setStoreType(nextArg(args, i++));
 423                         } else if(arg.equalsIgnoreCase("-verbose") || arg.equalsIgnoreCase("-v")) {
 424                             signJarParams.setVerbose(true);
 425                             verbose = true;
 426                         } else if (arg.equalsIgnoreCase("-outdir")) {
 427                             signJarParams.setOutdir(new File(nextArg(args, i++)));
 428                         } else if (arg.equalsIgnoreCase("-srcdir")) {
 429                             srcdir = nextArg(args, i++);
 430                         } else if (arg.equalsIgnoreCase("-srcfiles")) {
 431                             srcfiles = nextArg(args, i++);
 432                         } else {
 433                             throw new PackagerException("ERR_UnknownArgument", arg);
 434                         }
 435                     }
 436 
 437                     addResources(signJarParams, srcdir, srcfiles);
 438                     signJar = true;
 439                 } else if (args[0].equalsIgnoreCase("-makeall")) {
 440                     System.err.println("-makeall is deprecated");
 441                     for (int i = 1; i < args.length; i++) {
 442                         String arg = args[i];
 443                         if (arg.equalsIgnoreCase("-appclass")) {
 444                             makeAllParams.setAppClass(nextArg(args, i++));
 445                         } else if (arg.equalsIgnoreCase("-preloader")) {
 446                             makeAllParams.setPreloader(nextArg(args, i++));
 447                         } else if (arg.equalsIgnoreCase("-classpath")) {
 448                             makeAllParams.setClasspath(nextArg(args, i++));
 449                         } else if (arg.equalsIgnoreCase("-name")) {
 450                             makeAllParams.setAppName(nextArg(args, i++));
 451                         } else if(arg.equalsIgnoreCase("-width")) {
 452                             makeAllParams.setWidth(Integer.parseInt(nextArg(args, i++)));
 453                         } else if(arg.equalsIgnoreCase("-height")) {
 454                             makeAllParams.setHeight(Integer.parseInt(nextArg(args, i++)));
 455                         } else if(arg.equalsIgnoreCase("-v")) {
 456                             makeAllParams.setVerbose(true);
 457                         } else {
 458                             throw new PackagerException("ERR_UnknownArgument", arg);
 459                         }
 460                     }
 461                     makeAll = true;
 462                 } else if (args[0].equalsIgnoreCase("-help")) {
 463                     showBundlerHelp(args[1], args.length > 2 && "-verbose".equals(args[2]));
 464                 } else {
 465                     System.err.println(MessageFormat.format(
 466                                         bundle.getString("ERR_UnknownCommand"),
 467                                         args[0]));
 468                     System.exit(-1);
 469                 }
 470 
 471                 //set default logger
 472                 if (verbose) {
 473                     com.oracle.tools.packager.Log.setLogger(new com.oracle.tools.packager.Log.Logger(true));
 474                 } else {
 475                     com.oracle.tools.packager.Log.setLogger(new com.oracle.tools.packager.Log.Logger(false));
 476                 }
 477 
 478                 if (css2Bin) {
 479                     createBssParams.validate();
 480                     packager.generateBSS(createBssParams);
 481                 }
 482                 if (packageAsJar) {
 483                     createJarParams.validate();
 484                     packager.packageAsJar(createJarParams);
 485                 }
 486                 if (genJNLP) {
 487                     deployParams.setBundleType(BundleType.JNLP);
 488                     deployParams.validate();
 489                     packager.generateDeploymentPackages(deployParams);
 490                 }
 491                 if (genPackages) {
 492                     deployParams.setBundleType(bundleType);
 493                     deployParams.validate();
 494                     packager.generateDeploymentPackages(deployParams);
 495                 }
 496                 if (signJar) {
 497                     signJarParams.validate();
 498                     if (signJarParams.storePass == null) {
 499                         char[] passwd = System.console().readPassword(bundle.getString("MSG_EnterKeystorePassword"));
 500                         if (passwd == null) {
 501                             signJarParams.storePass = "";
 502                         } else {
 503                             signJarParams.storePass = new String(passwd);
 504                         }
 505                     }
 506                     if (signJarParams.keyPass == null) {
 507                         char[] passwd = System.console().readPassword(bundle.getString("MSG_EnterKeyPassword"), signJarParams.alias);
 508                         if (passwd == null) {
 509                             signJarParams.keyPass = "";
 510                         } else {
 511                             signJarParams.keyPass = new String(passwd);
 512                         }
 513                     }
 514                     packager.signJar(signJarParams);
 515                 }
 516                 if (makeAll) {
 517                     makeAllParams.validate();
 518                     packager.makeAll(makeAllParams);
 519                 }
 520 
 521             } catch (Exception e) {
 522                 if (verbose) {
 523                     throw e;
 524                 } else {
 525                     System.err.println(e.getMessage());
 526                     if (e.getCause() != null && e.getCause() != e) {
 527                         System.err.println(e.getCause().getMessage());
 528                     }
 529                     System.exit(-1);
 530                 }
 531             }
 532         }
 533     }
 534 
 535     private static final String MODULE = "--" + StandardBundlerParam.MODULE.getID();
 536     private static final String M = "-m";
 537     private static final String MODULE_PATH = "--" + StandardBundlerParam.MODULE_PATH.getID();
 538     private static final String P = "-p";
 539     private static final String ADD_MODULES = "--" + StandardBundlerParam.ADD_MODULES.getID();
 540     private static final String LIMIT_MODULES = "--" + StandardBundlerParam.LIMIT_MODULES.getID();
 541     private static final String STRIP_NATIVE_COMMANDS = "--" + StandardBundlerParam.STRIP_NATIVE_COMMANDS.getID();
 542 
 543     private static final String J_XDEBUG = JLinkBundlerHelper.DEBUG.getID() + ":";
 544     private static final String DETECT_MODULES = "--" + JLinkBundlerHelper.DETECT_MODULES.getID();
 545 
 546     public static void showBundlerHelp(String bundlerName, boolean verbose) {
 547         //TODO I18N
 548         if ("bundlers".equals(bundlerName)) {
 549             // enumerate bundlers
 550             System.out.println("Known Bundlers -- \n");
 551             for (Bundler bundler : Bundlers.createBundlersInstance().getBundlers()) {
 552                 try {
 553                     bundler.validate(new HashMap<>());
 554                 } catch (UnsupportedPlatformException upe) {
 555                     // don't list bundlers this platform cannot run
 556                     continue;
 557                 } catch (ConfigException ignore) {
 558                     // but requiring more than an empty map is perfectly fine.
 559                 //} catch (RuntimeException re) {
 560                 //    re.printStackTrace();
 561                 }
 562 
 563                 if (verbose) {
 564                     System.out.printf(
 565                             "%s - %s - %s\n\t%s\n",
 566                             bundler.getID(),
 567                             bundler.getName(),
 568                             bundler.getBundleType(),
 569                             bundler.getDescription()
 570                     );
 571                 } else {
 572                     System.out.printf(
 573                             "%s - %s - %s\n",
 574                             bundler.getID(),
 575                             bundler.getName(),
 576                             bundler.getBundleType()
 577                     );
 578                 }
 579             }
 580         } else {
 581             // enumerate parameters for a bundler
 582             for (Bundler bundler : Bundlers.createBundlersInstance().getBundlers()) {
 583                 if (bundler.getID().equals(bundlerName)) {
 584                     System.out.printf("Bundler Parameters for %s (%s) --\n", bundler.getName(), bundler.getID());
 585                     for (BundlerParamInfo bpi : bundler.getBundleParameters()) {
 586                         if (bpi.getStringConverter() == null) continue;
 587                         if (verbose) {
 588                             System.out.printf(
 589                                     "%s - %s - %s\n\t%s\n",
 590                                     bpi.getID(),
 591                                     bpi.getName(),
 592                                     bpi.getValueType().getSimpleName(),
 593                                     bpi.getDescription()
 594                             );
 595                         } else {
 596                             System.out.printf(
 597                                     "%s - %s - %s\n",
 598                                     bpi.getID(),
 599                                     bpi.getName(),
 600                                     bpi.getValueType().getSimpleName()
 601                             );
 602                         }
 603                     }
 604                     return;
 605                 }
 606             }
 607             System.out.printf("Sorry, no bundler matching the id %s was found.\n", bundlerName);
 608         }
 609     }
 610 }