Java App Bundlersレビュー

それで、 前回 JavaFXPackagerアプリケーションを構築するためのツールについて書いた。 アプリケーションをビルドするには2つの方法がありましたが、コードから簡単に呼び出すことはできませんでした。 しかし、私たちは真のJavaプログラマーです。 そして、バージョン8u20からのそのようなtru-programmersのために、JavaFXPackagerのJDKで特別なAPIが作成されました。 1つの問題は、このAPIが文書化されていないことです。 しかし、それは問題ではありません、私たちはそれを理解します。



情報源



もちろん、主なソースはJavaDocですが、これは公開されていません。 したがって、 ソースから自分で収集します 。 読者にこれを強制せずに、単純に投稿します: ginz.bitbucket.org/fxpackager-javadoc もちろん、APIの文書化が不十分であるため、ソースコードがあると便利です。



はじめに



最初に注意を払うのはどのクラスですか? 明らかに、この仕様のBundlerインターフェース:



// action methods File execute(Map<String,? super Object> params, File outputParentDir); boolean validate(Map<String,? super Object> params); // information methods Collection<BundlerParamInfo<?>> getBundleParameters(); String getBundleType(); String getDescription(); String getID(); String getName();
      
      







メソッドは、2つのタイプに明確に分類されます。指定されたパラメーターでアクションを実行するメソッドと、このバンドラーに関する情報を提供するメソッドです。



executeは、マップパラメーターと出力ディレクトリをパラメーターとして受け入れ、このディレクトリに予想される形式でバンドルを作成します。 ただし、validateが例外なしで成功した場合のみ正しい実行が期待でき、2つのタイプでスローできます:UnsupportedPlatformExceptionとConfigException。その音声名から、最初のスローをスローする場合は、プラットフォームでサポートされていないバンドラーを使用するだけです。 渡されたパラメーターに問題がある場合は、2番目のパラメーターがスローされます。



そして、一般的にこれらのメソッドにパラメーターとして渡すことができるものは何ですか? これらのメソッドのキーのほとんどは、 BundlerParamInfoクラスのすべての静的インスタンスにあり、そのほとんど(共通のクロスプラットフォームパラメーター)はStandardBundlerParamクラスにあり、より具体的な(プラットフォーム固有)は通常、 Bundler実装クラス自体にあります。 LinuxAppBundlerWinExeBundlerなど。 このクラスが、実行するために渡すparamsに入れるものと一般的にどのように関係するかは完全には明らかではありませんが。 実際、getID()によって取得されたidはこのMapのキーであり、値はBundlerParamInfoがパラメーター化されたタイプでなければならないことがわかります。



そして、バンドラーのインスタンスを取得する方法は?



Bundlersインターフェースの静的createBundlersInstanceメソッド(警告、HOT:Java 8)を使用して、可能なすべての「事前定義済み」 Bundlerを取得する最も簡単な方法:



 public static List<Bundler> getSuitableBundlers() { return Bundlers.createBundlersInstance() .getBundlers() .stream() .filter(bundler -> { try { bundler.validate(Collections.emptyMap()); } catch (UnsupportedPlatformException ex) { return false; } catch (ConfigException ignored) { } return true; }).collect(Collectors.toList()); }
      
      







したがって、すべての「プリインストールされた」バンドルを受け取っただけでなく、プラットフォームの原則に従ってフィルタリングしました。原則として、あるプラットフォームのパッケージを別のプラットフォームで収集することはできません。



そして何、例はありませんか?!



そして、確かに、理論化をやめて、ある種の例を描くことができます。



静的型付けは常に優れていると思われるので、BunderParamsBuilderのようなものでパラメーターの連想配列の作成をラップできます。



 public class BundlerParamsBuilder { private Map<String, Object> params = new HashMap<>(); public <T> BundlerParamsBuilder setParam(BundlerParamInfo<T> param, T value) { params.put(param.getID(), value); return this; } public BundlerParamsBuilder unsafeSetParam(String key, Object value) { params.put(key, value); return this; } public Map<String, Object> build() { return new HashMap<>(params); } }
      
      





したがって、プロジェクトのアセンブリはほぼ次のようになります(実行中の/tmp/helloWorld.jarの存在が暗示されます)。



 List<Bundler> bundlers = getSuitableBundlers(); Path directoryWithBundles = Files.createTempDirectory("bundles"); Path jar = Paths.get("/tmp/helloWorld.jar"); RelativeFileSet mainJar = new RelativeFileSet(jar.getParent().toFile(), new HashSet<File>( Arrays.asList(jar.toFile()) )); Map<String, Object> params = new BundlerParamsBuilder() .setParam(StandardBundlerParam.APP_NAME, "HelloWorld") .setParam(StandardBundlerParam.APP_RESOURCES, mainJar) .build(); bundlers.forEach(bundler -> bundler.execute(params, directoryWithBundles.toFile())); System.out.println("Bundles are created in " + directoryWithBundles); System.out.println("Parameters after bundling: " + params);
      
      





打ち上げ後の排気は、ほぼ次のようになります。

バンドルは/ tmp / bundles5791581710818077755に作成されます
バンドル後のパラメーター:{appVersion = 1.0、copyright = Copyright(C)2015、stopOnUninstall = true、.mac-jdk.runtime.rules = [Lcom.oracle.tools.packager.JreUtils $ Rule; @ 4c3e4790、mac.app。 bundler = Macアプリケーションイメージ、linux.deb.imageRoot = / tmp / fxbundler6592356981290936843 / images / linux-deb.image / helloworld-1.0 / opt、buildRoot = / tmp / fxbundler6592356981290936843、mac.bundle-id-signing-prefix = 、linux.deb.licenseText =不明、linux.deb.maintainer =不明<Unknown>、jvmProperties = {}、mac.signing-key-user-name =、licenseFile = []、identifier = HelloWorld、linux.rpm.imageDir = / tmp / fxbundler6592356981290936843 / images / linux-rpm.image、runtime = RelativeFileSet {basedir:/home/dginzburg/soft/jdk1.8.0_25/jre、files:[<非常に大きなファイルのリスト>]}、shortcutHint = false 、mainJar = RelativeFileSet {basedir:/ tmp、ファイル:[helloWorld.jar]}、jvmOptions = []、name.fs = HelloWorld、fxPackaging = false、name = HelloWorld、appResources = RelativeFileSet {basedir:/ tmp、files:[ helloWorld.jar]}、mac.category =不明、linux.deb.imageDir = / tmp  /fxbundler6592356981290936843/images/linux-deb.image/helloworld-1.0、.mac.default.icns = GenericAppHiDPI.icns、runAtStartup = false、linux.app.bundler = Linux Application Image、mac.signing-key-developer-id- app = null、linux.launcher.url = jar:ファイル:/home/dginzburg/soft/jdk1.8.0_25/lib/ant-javafx.jar!/ com / oracle / tools / packager / linux / JavaAppLauncher、説明= HelloWorld 、configRoot = / tmp / fxbundler6592356981290936843 / macosx、preferencesID = HelloWorld、title = HelloWorld、linux.bundleName = helloworld、startOnInstall = false、mac.pkg.packagesRoot = / tmp / fxbundler659235698129093pepe = helloworld-1.0、mac.CFBundleIdentifier = HelloWorld、serviceHint = false、vendor = Unknown、email = Unknown、applicationCategory = Unknown、mac.app.imageRoot = / tmp / fxbundler6592356981290936843 / images / dmg.image、userJvmOptions = {} =、linux.deb.configDir = / tmp / fxbundler6592356981290936843 / images / linux-deb.image / helloworld-1.0 / DEBIAN、verbose = false、imagesRoot = / tmp / fxbundler6592  356981290936843 / images、mac.daemon.image = / tmp / fxbundler6592356981290936843 / images / pkg.daemon、applicationClass = HelloWorld、.linux.runtime.rules = [Lcom.oracle.tools.packager.JreUtils $ Rule; @ 38cccef、menu true}




ああ、どこから来たの? paramsには2つのパラメーターのみを配置します。 これを理解するには、paramsからパラメーター値を取得するために使用されるBunderParamInfo.fetchFromメソッドの種類を調べる必要があります。



 //... if (getDefaultValueFunction() != null) { T result = getDefaultValueFunction().apply(params); if (result != null) { params.put(getID(), result); } return result; } //...
      
      





ええ、パラメーターがparamsに見つからず、他のパラメーターから取得できる場合(defaultValueFunction関数がこれを担当します)、この方法で取得した値はparamsに詰め込まれます。 たとえば、MAIN_JARパラメーターは指定しませんでしたが、実行可能ファイルを作成するにはMAIN_JARが必要です。 MAIN_JARの定義方法を見てみましょう。defaultValueFunctionとして次のように表示されます。



 params -> { extractMainClassInfoFromAppResources(params); return (RelativeFileSet) params.get("mainJar"); }
      
      





これが答えです。mainJarの値はどこから来ますか。



オプションの全リスト



毎回パラメーターを検索しないようにするため、見つかったBundlerParamInfoのすべての静的インスタンスに関する情報を表示するプレートを作成しました。



おわりに



最小限の最も明白な機能が説明されているので、JavaDoc、さらにはコードを読んでください。

記事は、解説者の要求に応じて改善および修正されます。



All Articles