SlideShare uma empresa Scribd logo
1 de 18
ダブルクリックで起動する
JavaFXアプリケーションJAR
 第8回 JavaFX勉強会 2012-11-30
 高橋   徹 (@boochnich & Java読書会)
発表者について
              @boochnich
         http://d.hatena.ne.jp/torutk/
• Java GUI歴
  – jdk1.0時代はAWT
  – jdk1.1時代はAWT、Netscape IFC、Swing
  – jdk1.2以降はSwing、Java2D、(Java3D)

• Java読書会BOF代表
  – 1998年~毎月1回開催、通算164回、24冊目
  http://www.javareading.com/bof/
はじめに
• JavaFXアプリケーションの起動方法

 – スタンドアロン・プログラム
 – Webスタート
 – Webページに埋め込み
 – セルフ・コンテインメント・アプリケーショ
   ン
  javafxpackagerでスタンドアロン・プログラム
      (実行可能JAR)を作成する話です。
アジェンダ
•   JDK 7u9の中にJavaFX 2.2.3
•   NetBeansでJavaFXアプリケーションを作成
•   コマンドでダブルクリック起動JARを作成
•   (おまけ)OS固有のインストーラを作成
JDK 7u9の中のJavaFX 2.2.3
C:Program FilesJavajdk1.7.0        (Windows OSの例)
  +-- bin
                                        JDKのディクレト
  |     +-- javafxpackager.exe
  +-- jre                               リツリー中に
  |     +-- lib                         JavaFX関連ファイ
  |           +-- javafx.properties
                                        ルが含まれてい
  |           +-- jfxrt.jar
  +-- lib
                                        ます。
        +-- ant-javafx.jar
        +-- javafx-doclet.jar

(抜粋につき、すべてのJavaFX関連ファイルを記載してはおりません)
NetBeansでJavaFXアプリケーション(1/5)

• NetBeansで新規プロジェクト[JavaFXアプリ
  ケーション]を選択し、雛形を作成

• プレゼンなので文字を大きく
 – CSSでチャレンジしてみます


• NetBeans上でビルドして実行
NetBeansでJavaFXアプリケーション(2/5)

• ファイルエクスプローラでJARをダブルク
  リック




• コマンドプロンプトからjava –jarコマンド
  実行
NetBeansでJavaFXアプリケーション(3/5)

• ソースを自分でコンパイル、JAR化してみ
   る
 >javac -cp “C:Program Filesjavajdk1.7.0jrelibjfxrt.jar“
 -d buildclasses -encoding UTF-8   srchellojjfxugHelloJjfxug.java

>jar cvfm Hello.jar hello.mf -C buildclasses .
マニフェストが追加されました
hellojjfxug/を追加中です(入=0)(出=0)(0%格納されました)
hellojjfxug/HelloJjfxug$1.classを追加中です(入=944)(出=539)(42%収縮されました)
hellojjfxug/HelloJjfxug.classを追加中です(入=1413)(出=864)(38%収縮されました)
hellojjfxug/HelloJjfxug.cssを追加中です(入=302)(出=214)(29%収縮されました)

>java –jar Hello.jar
Exception in thread "main" java.lang.NoClassDefFoundError: javafx/app
lication/Application
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:791)


 残念、動きませんでした。クラスパス指定が不足してます。
NetBeansでJavaFXアプリケーション(4/5)

• 違いはなにか?
   – NetBeansの生成したJARと比較してみる

                                                    NetBeansの生成したJAR
com/javafx/main/Main$1.class
com/javafx/main/Main$2.class                        にだけ含まれるクラス
com/javafx/main/Main.class                          ファイル群
com/javafx/main/NoJavaFXFallback.class

Manifest-Version: 1.0
JavaFX-Version: 2.2
implementation-vendor: torutk
implementation-title: HelloJjfxug                   NetBeansの生成したJAR
implementation-version: 1.0                         のMANIFEST.MF内容
JavaFX-Application-Class: hellojjfxug.HelloJjfxug
JavaFX-Class-Path: HelloJjfxug.jar
Created-By: JavaFX Packager
Main-Class: com/javafx/main/Main
NetBeansでJavaFXアプリケーション(5/5)

• -Djavafx.verbose=true             を指定しJARを起動する
>java -Djavafx.verbose=true -jar distHelloJjfxug.jar
 : (中略)
1) Try existing classpath...
===== URL list
file:/C:/work/HelloJjfxug/dist/HelloJjfxug.jar
=====
2) Try javafx.runtime.path property...
3) Look for cobundled JavaFX ... [java.home=C:Program FilesJavajdk1.7.0jre
===== URL list
file:/C:/work/HelloJjfxug/dist/HelloJjfxug.jar
file:/C:/Program%20Files/Java/jdk1.7.0/jre/lib/jfxrt.jar
file:/C:/Program%20Files/Java/jdk1.7.0/jre/lib/deploy.jar
file:/C:/Program%20Files/Java/jdk1.7.0/jre/lib/plugin.jar
file:/C:/Program%20Files/Java/jdk1.7.0/jre/lib/javaws.jar
=====
Try calling Class.forName(hellojjfxug.HelloJjfxug) using classLoader = java.net.
URLClassLoader@6f404c51
found class: class hellojjfxug.HelloJjfxug
 : (後略)
ダブルクリックで起動するJARの作り方

• javafxpackagerを使うと、実行可能JARを作
  成できます。
 >javafxpackager -createjar -nocss2bin
                                                      Applicationクラスを継
  -appclass hellojjfxug.HelloJjfxug                   承したmainメソッドを
  -srcdir buildclasses                               持つクラスを指定
  -outdir .                                       -srcdirですが、JARに含
  -outfile HelloJjfxug-0.1                        めるクラスファイルの
                                                  あるディレクトリを指
                                                  定
 > java –jar HelloJjfxug-0.1.jar
                                                 JARファイル名(拡張
                                                 子不要)を指定

 コマンドリファレンス
 http://docs.oracle.com/javafx/2/deployment/javafxpackager001.htm
情報源
• 「Oracle Blogs日本語のまとめ」より
  [JavaFX] Native packaging for JavaFX
  • http://orablogs-jp.blogspot.jp/2012/06/native-
    packaging-for-javafx.html
• Oracle JavaFXドキュメント
  ”Deploying JavaFX Applications”より
  • http://docs.oracle.com/javafx/2/deployment/jfxp
    ub-deployment.htm
      5.5 Create the Main Application JAR File など
まとめ
• JavaFXには、アプリケーションのインストール・
  実行・更新の仕組みがあります。
• NetBeans 7.3ではプロジェクトの設定のみで簡単
  に利用できます。
• javafxpackagerコマンド(またはAntタスク)が提
  供されています。
• eclipse派な人にはe(fx)clipseプラグインがありま
  す。
おまけ MSI形式の作成
• javapackagerでWindows MSI形式のインスト
  ーラを作成可能です。
  – 要WiX(Windows Installer XML) ・・・無償


• NetBeans 7.3 beta2でも可能です。

• 詳しくはブログで
  http://d.hatena.ne.jp/torutk/20121119
おまけ2 RPM形式の作成

• javapackagerでLinux RPM形式のインストー
  ラを作成可能です。
 – rpmbuildコマンドが実行できること
• NetBeans 7.3 beta2でも可能です。
サンプルプログラム注釈
CSSファイルの読み込み(ソースファイルと同じ場所に置く場合)
  Scene scene = new Scene(root, 300, 250);
  scene.getStylesheets().add(
      this.getClass().getResource("HelloJjfxug.css").toExternalForm());



CSSファイルの記述(Buttonクラスのフォント設定)
  .button {
      -fx-font-size: 24;
      -fx-font-family: Meiryo sans-serif;
  }
NetBeansでJavaFXアプリケーション(補
               1)
• com.javafx.main.Mainクラスを調べる
   – システムプロパティjava.home
   – URLClassLoaderでApplication継承クラスをロー
     ドしmainメソッドを実行している。
ClassLoader urlClassLoader = new URLClassLoader(urls, null);
  :
Thread.currentThread().setContextClassLoader(urlClassLoader);
  :
Class appClass = Class.forName(appName, false,
       Thread.currentThread().getContextClassLoader());
  :
Method mainMethod = appClass.getMethod("main", new Class[] { new
String[0].getClass() });
  :
mainMethod.invoke(null, new Object[] { args });
ねこび~ん
• ねこび~んのアイコン
 http://ja.netbeans.org/nekobean/


• 泣き声
 http://koukaongen.com/

Mais conteúdo relacionado

Mais procurados

JenkinsとjMeterで負荷テストの自動化
JenkinsとjMeterで負荷テストの自動化JenkinsとjMeterで負荷テストの自動化
JenkinsとjMeterで負荷テストの自動化Satoshi Akama
 
HeapStats(Java解析ツールバトル)
HeapStats(Java解析ツールバトル)HeapStats(Java解析ツールバトル)
HeapStats(Java解析ツールバトル)Yasumasa Suenaga
 
Java デバッガ活用術 ~勘デバッグ・print デバッグから抜けだそう~ #jjug_ccc #ccc_h4
Java デバッガ活用術 ~勘デバッグ・print デバッグから抜けだそう~ #jjug_ccc #ccc_h4Java デバッガ活用術 ~勘デバッグ・print デバッグから抜けだそう~ #jjug_ccc #ccc_h4
Java デバッガ活用術 ~勘デバッグ・print デバッグから抜けだそう~ #jjug_ccc #ccc_h4Yusuke Yamamoto
 
継続的インテグレーションとテストの話
継続的インテグレーションとテストの話継続的インテグレーションとテストの話
継続的インテグレーションとテストの話Preferred Networks
 
Sd Loader Seasar Con2009 White
Sd Loader Seasar Con2009 WhiteSd Loader Seasar Con2009 White
Sd Loader Seasar Con2009 WhiteAkio Katayama
 
Javaアプリケーションサーバ 構築・運用の勘所
Javaアプリケーションサーバ 構築・運用の勘所Javaアプリケーションサーバ 構築・運用の勘所
Javaアプリケーションサーバ 構築・運用の勘所Takahiro YAMADA
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードKazuhiro Hara
 
Web技術勉強会 第30回
Web技術勉強会 第30回Web技術勉強会 第30回
Web技術勉強会 第30回龍一 田中
 
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発Yoshitaka Kawashima
 
Apache Archiva を試す
Apache Archiva を試すApache Archiva を試す
Apache Archiva を試すbouzuya
 
Web技術勉強会 第31回
Web技術勉強会 第31回Web技術勉強会 第31回
Web技術勉強会 第31回龍一 田中
 
はじめての CircleCI
はじめての CircleCIはじめての CircleCI
はじめての CircleCIYosuke Mizutani
 
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷JavaTomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷JavaNorito Agetsuma
 
大規模な負荷でもドキドキしない為のJava EE
大規模な負荷でもドキドキしない為のJava EE大規模な負荷でもドキドキしない為のJava EE
大規模な負荷でもドキドキしない為のJava EETaiichilow Nagase
 
ゲームインフラコンテナ実践導入
ゲームインフラコンテナ実践導入ゲームインフラコンテナ実践導入
ゲームインフラコンテナ実践導入Hiroki Tamiya
 
Jmeter20120421
Jmeter20120421Jmeter20120421
Jmeter20120421hatakyo
 
負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~
負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~
負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~johgus johgus
 
Migration Guide from Java 8 to Java 11 #jjug
Migration Guide from Java 8 to Java 11 #jjugMigration Guide from Java 8 to Java 11 #jjug
Migration Guide from Java 8 to Java 11 #jjugYuji Kubota
 
アプリ屋もDockerをドカドカ使おう ~ Docker入門
アプリ屋もDockerをドカドカ使おう ~ Docker入門アプリ屋もDockerをドカドカ使おう ~ Docker入門
アプリ屋もDockerをドカドカ使おう ~ Docker入門Hori Tasuku
 

Mais procurados (20)

JenkinsとjMeterで負荷テストの自動化
JenkinsとjMeterで負荷テストの自動化JenkinsとjMeterで負荷テストの自動化
JenkinsとjMeterで負荷テストの自動化
 
HeapStats(Java解析ツールバトル)
HeapStats(Java解析ツールバトル)HeapStats(Java解析ツールバトル)
HeapStats(Java解析ツールバトル)
 
Java デバッガ活用術 ~勘デバッグ・print デバッグから抜けだそう~ #jjug_ccc #ccc_h4
Java デバッガ活用術 ~勘デバッグ・print デバッグから抜けだそう~ #jjug_ccc #ccc_h4Java デバッガ活用術 ~勘デバッグ・print デバッグから抜けだそう~ #jjug_ccc #ccc_h4
Java デバッガ活用術 ~勘デバッグ・print デバッグから抜けだそう~ #jjug_ccc #ccc_h4
 
継続的インテグレーションとテストの話
継続的インテグレーションとテストの話継続的インテグレーションとテストの話
継続的インテグレーションとテストの話
 
Sd Loader Seasar Con2009 White
Sd Loader Seasar Con2009 WhiteSd Loader Seasar Con2009 White
Sd Loader Seasar Con2009 White
 
Javaアプリケーションサーバ 構築・運用の勘所
Javaアプリケーションサーバ 構築・運用の勘所Javaアプリケーションサーバ 構築・運用の勘所
Javaアプリケーションサーバ 構築・運用の勘所
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレード
 
Web技術勉強会 第30回
Web技術勉強会 第30回Web技術勉強会 第30回
Web技術勉強会 第30回
 
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
マイクロフレームワークEnkan(とKotowari)ではじめるREPL駆動開発
 
Apache Archiva を試す
Apache Archiva を試すApache Archiva を試す
Apache Archiva を試す
 
Web技術勉強会 第31回
Web技術勉強会 第31回Web技術勉強会 第31回
Web技術勉強会 第31回
 
はじめての CircleCI
はじめての CircleCIはじめての CircleCI
はじめての CircleCI
 
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷JavaTomcatの実装から学ぶクラスローダリーク #渋谷Java
Tomcatの実装から学ぶクラスローダリーク #渋谷Java
 
大規模な負荷でもドキドキしない為のJava EE
大規模な負荷でもドキドキしない為のJava EE大規模な負荷でもドキドキしない為のJava EE
大規模な負荷でもドキドキしない為のJava EE
 
ゲームインフラコンテナ実践導入
ゲームインフラコンテナ実践導入ゲームインフラコンテナ実践導入
ゲームインフラコンテナ実践導入
 
Jmeter20120421
Jmeter20120421Jmeter20120421
Jmeter20120421
 
Hudson (JJUG CCCにて)
Hudson (JJUG CCCにて)Hudson (JJUG CCCにて)
Hudson (JJUG CCCにて)
 
負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~
負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~
負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~
 
Migration Guide from Java 8 to Java 11 #jjug
Migration Guide from Java 8 to Java 11 #jjugMigration Guide from Java 8 to Java 11 #jjug
Migration Guide from Java 8 to Java 11 #jjug
 
アプリ屋もDockerをドカドカ使おう ~ Docker入門
アプリ屋もDockerをドカドカ使おう ~ Docker入門アプリ屋もDockerをドカドカ使おう ~ Docker入門
アプリ屋もDockerをドカドカ使おう ~ Docker入門
 

Semelhante a 実行可能JavaFXアプリケーションJAR(発表直前版)

JavaFX & GlassFish 勉強会 Project Visage
JavaFX & GlassFish 勉強会 Project VisageJavaFX & GlassFish 勉強会 Project Visage
JavaFX & GlassFish 勉強会 Project VisageYuichi Sakuraba
 
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-PE-BANK
 
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)a know
 
Neo4j を Javaプログラムから使う
Neo4j を Javaプログラムから使うNeo4j を Javaプログラムから使う
Neo4j を Javaプログラムから使うMasahiro Satake
 
WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」Hiroaki NAKADA
 
OpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajo
OpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajoOpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajo
OpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajoTakahiro YAMADA
 
Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発Kota Mizushima
 
今年はJava進化の年!今知っておくべき新しいJava
今年はJava進化の年!今知っておくべき新しいJava今年はJava進化の年!今知っておくべき新しいJava
今年はJava進化の年!今知っておくべき新しいJavaTakashi Ito
 
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsWildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsYoshimasa Tanabe
 
LLoT2016 Java Update
LLoT2016 Java UpdateLLoT2016 Java Update
LLoT2016 Java Updatetorutk
 
Beginning Java EE 6 勉強会(1) #bje_study
Beginning Java EE 6 勉強会(1) #bje_studyBeginning Java EE 6 勉強会(1) #bje_study
Beginning Java EE 6 勉強会(1) #bje_studyToshiaki Maki
 
最新のJava言語仕様で見るモジュールシステム #jjug
最新のJava言語仕様で見るモジュールシステム #jjug最新のJava言語仕様で見るモジュールシステム #jjug
最新のJava言語仕様で見るモジュールシステム #jjugJustSystems Corporation
 
JavaOne2015報告またはこれからのJava
JavaOne2015報告またはこれからのJavaJavaOne2015報告またはこれからのJava
JavaOne2015報告またはこれからのJavaなおき きしだ
 
Java SE 再入門
Java SE 再入門Java SE 再入門
Java SE 再入門minazou67
 
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireAkio Katayama
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情takezoe
 
Java EE 再入門
Java EE 再入門Java EE 再入門
Java EE 再入門minazou67
 

Semelhante a 実行可能JavaFXアプリケーションJAR(発表直前版) (20)

JavaFX & GlassFish 勉強会 Project Visage
JavaFX & GlassFish 勉強会 Project VisageJavaFX & GlassFish 勉強会 Project Visage
JavaFX & GlassFish 勉強会 Project Visage
 
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
Javaヂカラ #Java最新動向 -Java 11 の新機能やOracle Code One 2018 発の最新技術トレンドを一気にキャッチアップ-
 
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
 
Neo4j を Javaプログラムから使う
Neo4j を Javaプログラムから使うNeo4j を Javaプログラムから使う
Neo4j を Javaプログラムから使う
 
WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」
 
OpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajo
OpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajoOpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajo
OpenJDKソムリエと巡るJDKワイナリーツアー #sfggjp #javajo
 
Java in the World of Container by David Buck
Java in the World of Container by David BuckJava in the World of Container by David Buck
Java in the World of Container by David Buck
 
Quarkus入門
Quarkus入門Quarkus入門
Quarkus入門
 
Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発
 
今年はJava進化の年!今知っておくべき新しいJava
今年はJava進化の年!今知っておくべき新しいJava今年はJava進化の年!今知っておくべき新しいJava
今年はJava進化の年!今知っておくべき新しいJava
 
WildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE AppsWildFly Swarm - Rightsize Your Java EE Apps
WildFly Swarm - Rightsize Your Java EE Apps
 
LLoT2016 Java Update
LLoT2016 Java UpdateLLoT2016 Java Update
LLoT2016 Java Update
 
Beginning Java EE 6 勉強会(1) #bje_study
Beginning Java EE 6 勉強会(1) #bje_studyBeginning Java EE 6 勉強会(1) #bje_study
Beginning Java EE 6 勉強会(1) #bje_study
 
Maven2 plugin
Maven2 pluginMaven2 plugin
Maven2 plugin
 
最新のJava言語仕様で見るモジュールシステム #jjug
最新のJava言語仕様で見るモジュールシステム #jjug最新のJava言語仕様で見るモジュールシステム #jjug
最新のJava言語仕様で見るモジュールシステム #jjug
 
JavaOne2015報告またはこれからのJava
JavaOne2015報告またはこれからのJavaJavaOne2015報告またはこれからのJava
JavaOne2015報告またはこれからのJava
 
Java SE 再入門
Java SE 再入門Java SE 再入門
Java SE 再入門
 
SDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 WhireSDLoader SeasarCon 2009 Whire
SDLoader SeasarCon 2009 Whire
 
イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情
 
Java EE 再入門
Java EE 再入門Java EE 再入門
Java EE 再入門
 

Mais de torutk

LL2021 Java update
LL2021 Java updateLL2021 Java update
LL2021 Java updatetorutk
 
Jjugccc2017spring m6 javafx
Jjugccc2017spring m6 javafxJjugccc2017spring m6 javafx
Jjugccc2017spring m6 javafxtorutk
 
JJUG CCC 2016 Fall: World is not a square, rendering world coastline map with...
JJUG CCC 2016 Fall: World is not a square, rendering world coastline map with...JJUG CCC 2016 Fall: World is not a square, rendering world coastline map with...
JJUG CCC 2016 Fall: World is not a square, rendering world coastline map with...torutk
 
Java FXグラフィックスとアニメーション入門(JJUG CCC 2015 Spring G-7)
Java FXグラフィックスとアニメーション入門(JJUG CCC 2015 Spring G-7)Java FXグラフィックスとアニメーション入門(JJUG CCC 2015 Spring G-7)
Java FXグラフィックスとアニメーション入門(JJUG CCC 2015 Spring G-7)torutk
 
Java one 2013 sf 報告会lt
Java one 2013 sf 報告会ltJava one 2013 sf 報告会lt
Java one 2013 sf 報告会lttorutk
 
Jjug night seminar201208_lt_cxxからjvm起動
Jjug night seminar201208_lt_cxxからjvm起動Jjug night seminar201208_lt_cxxからjvm起動
Jjug night seminar201208_lt_cxxからjvm起動torutk
 
2012年javaメモリリーク
2012年javaメモリリーク2012年javaメモリリーク
2012年javaメモリリークtorutk
 
2011年javaの旅
2011年javaの旅2011年javaの旅
2011年javaの旅torutk
 

Mais de torutk (8)

LL2021 Java update
LL2021 Java updateLL2021 Java update
LL2021 Java update
 
Jjugccc2017spring m6 javafx
Jjugccc2017spring m6 javafxJjugccc2017spring m6 javafx
Jjugccc2017spring m6 javafx
 
JJUG CCC 2016 Fall: World is not a square, rendering world coastline map with...
JJUG CCC 2016 Fall: World is not a square, rendering world coastline map with...JJUG CCC 2016 Fall: World is not a square, rendering world coastline map with...
JJUG CCC 2016 Fall: World is not a square, rendering world coastline map with...
 
Java FXグラフィックスとアニメーション入門(JJUG CCC 2015 Spring G-7)
Java FXグラフィックスとアニメーション入門(JJUG CCC 2015 Spring G-7)Java FXグラフィックスとアニメーション入門(JJUG CCC 2015 Spring G-7)
Java FXグラフィックスとアニメーション入門(JJUG CCC 2015 Spring G-7)
 
Java one 2013 sf 報告会lt
Java one 2013 sf 報告会ltJava one 2013 sf 報告会lt
Java one 2013 sf 報告会lt
 
Jjug night seminar201208_lt_cxxからjvm起動
Jjug night seminar201208_lt_cxxからjvm起動Jjug night seminar201208_lt_cxxからjvm起動
Jjug night seminar201208_lt_cxxからjvm起動
 
2012年javaメモリリーク
2012年javaメモリリーク2012年javaメモリリーク
2012年javaメモリリーク
 
2011年javaの旅
2011年javaの旅2011年javaの旅
2011年javaの旅
 

実行可能JavaFXアプリケーションJAR(発表直前版)

  • 2. 発表者について @boochnich http://d.hatena.ne.jp/torutk/ • Java GUI歴 – jdk1.0時代はAWT – jdk1.1時代はAWT、Netscape IFC、Swing – jdk1.2以降はSwing、Java2D、(Java3D) • Java読書会BOF代表 – 1998年~毎月1回開催、通算164回、24冊目 http://www.javareading.com/bof/
  • 3. はじめに • JavaFXアプリケーションの起動方法 – スタンドアロン・プログラム – Webスタート – Webページに埋め込み – セルフ・コンテインメント・アプリケーショ ン javafxpackagerでスタンドアロン・プログラム (実行可能JAR)を作成する話です。
  • 4. アジェンダ • JDK 7u9の中にJavaFX 2.2.3 • NetBeansでJavaFXアプリケーションを作成 • コマンドでダブルクリック起動JARを作成 • (おまけ)OS固有のインストーラを作成
  • 5. JDK 7u9の中のJavaFX 2.2.3 C:Program FilesJavajdk1.7.0 (Windows OSの例) +-- bin JDKのディクレト | +-- javafxpackager.exe +-- jre リツリー中に | +-- lib JavaFX関連ファイ | +-- javafx.properties ルが含まれてい | +-- jfxrt.jar +-- lib ます。 +-- ant-javafx.jar +-- javafx-doclet.jar (抜粋につき、すべてのJavaFX関連ファイルを記載してはおりません)
  • 6. NetBeansでJavaFXアプリケーション(1/5) • NetBeansで新規プロジェクト[JavaFXアプリ ケーション]を選択し、雛形を作成 • プレゼンなので文字を大きく – CSSでチャレンジしてみます • NetBeans上でビルドして実行
  • 7. NetBeansでJavaFXアプリケーション(2/5) • ファイルエクスプローラでJARをダブルク リック • コマンドプロンプトからjava –jarコマンド 実行
  • 8. NetBeansでJavaFXアプリケーション(3/5) • ソースを自分でコンパイル、JAR化してみ る >javac -cp “C:Program Filesjavajdk1.7.0jrelibjfxrt.jar“ -d buildclasses -encoding UTF-8 srchellojjfxugHelloJjfxug.java >jar cvfm Hello.jar hello.mf -C buildclasses . マニフェストが追加されました hellojjfxug/を追加中です(入=0)(出=0)(0%格納されました) hellojjfxug/HelloJjfxug$1.classを追加中です(入=944)(出=539)(42%収縮されました) hellojjfxug/HelloJjfxug.classを追加中です(入=1413)(出=864)(38%収縮されました) hellojjfxug/HelloJjfxug.cssを追加中です(入=302)(出=214)(29%収縮されました) >java –jar Hello.jar Exception in thread "main" java.lang.NoClassDefFoundError: javafx/app lication/Application at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:791) 残念、動きませんでした。クラスパス指定が不足してます。
  • 9. NetBeansでJavaFXアプリケーション(4/5) • 違いはなにか? – NetBeansの生成したJARと比較してみる NetBeansの生成したJAR com/javafx/main/Main$1.class com/javafx/main/Main$2.class にだけ含まれるクラス com/javafx/main/Main.class ファイル群 com/javafx/main/NoJavaFXFallback.class Manifest-Version: 1.0 JavaFX-Version: 2.2 implementation-vendor: torutk implementation-title: HelloJjfxug NetBeansの生成したJAR implementation-version: 1.0 のMANIFEST.MF内容 JavaFX-Application-Class: hellojjfxug.HelloJjfxug JavaFX-Class-Path: HelloJjfxug.jar Created-By: JavaFX Packager Main-Class: com/javafx/main/Main
  • 10. NetBeansでJavaFXアプリケーション(5/5) • -Djavafx.verbose=true を指定しJARを起動する >java -Djavafx.verbose=true -jar distHelloJjfxug.jar : (中略) 1) Try existing classpath... ===== URL list file:/C:/work/HelloJjfxug/dist/HelloJjfxug.jar ===== 2) Try javafx.runtime.path property... 3) Look for cobundled JavaFX ... [java.home=C:Program FilesJavajdk1.7.0jre ===== URL list file:/C:/work/HelloJjfxug/dist/HelloJjfxug.jar file:/C:/Program%20Files/Java/jdk1.7.0/jre/lib/jfxrt.jar file:/C:/Program%20Files/Java/jdk1.7.0/jre/lib/deploy.jar file:/C:/Program%20Files/Java/jdk1.7.0/jre/lib/plugin.jar file:/C:/Program%20Files/Java/jdk1.7.0/jre/lib/javaws.jar ===== Try calling Class.forName(hellojjfxug.HelloJjfxug) using classLoader = java.net. URLClassLoader@6f404c51 found class: class hellojjfxug.HelloJjfxug : (後略)
  • 11. ダブルクリックで起動するJARの作り方 • javafxpackagerを使うと、実行可能JARを作 成できます。 >javafxpackager -createjar -nocss2bin Applicationクラスを継 -appclass hellojjfxug.HelloJjfxug 承したmainメソッドを -srcdir buildclasses 持つクラスを指定 -outdir . -srcdirですが、JARに含 -outfile HelloJjfxug-0.1 めるクラスファイルの あるディレクトリを指 定 > java –jar HelloJjfxug-0.1.jar JARファイル名(拡張 子不要)を指定 コマンドリファレンス http://docs.oracle.com/javafx/2/deployment/javafxpackager001.htm
  • 12. 情報源 • 「Oracle Blogs日本語のまとめ」より [JavaFX] Native packaging for JavaFX • http://orablogs-jp.blogspot.jp/2012/06/native- packaging-for-javafx.html • Oracle JavaFXドキュメント ”Deploying JavaFX Applications”より • http://docs.oracle.com/javafx/2/deployment/jfxp ub-deployment.htm 5.5 Create the Main Application JAR File など
  • 13. まとめ • JavaFXには、アプリケーションのインストール・ 実行・更新の仕組みがあります。 • NetBeans 7.3ではプロジェクトの設定のみで簡単 に利用できます。 • javafxpackagerコマンド(またはAntタスク)が提 供されています。 • eclipse派な人にはe(fx)clipseプラグインがありま す。
  • 14. おまけ MSI形式の作成 • javapackagerでWindows MSI形式のインスト ーラを作成可能です。 – 要WiX(Windows Installer XML) ・・・無償 • NetBeans 7.3 beta2でも可能です。 • 詳しくはブログで http://d.hatena.ne.jp/torutk/20121119
  • 15. おまけ2 RPM形式の作成 • javapackagerでLinux RPM形式のインストー ラを作成可能です。 – rpmbuildコマンドが実行できること • NetBeans 7.3 beta2でも可能です。
  • 16. サンプルプログラム注釈 CSSファイルの読み込み(ソースファイルと同じ場所に置く場合) Scene scene = new Scene(root, 300, 250); scene.getStylesheets().add( this.getClass().getResource("HelloJjfxug.css").toExternalForm()); CSSファイルの記述(Buttonクラスのフォント設定) .button { -fx-font-size: 24; -fx-font-family: Meiryo sans-serif; }
  • 17. NetBeansでJavaFXアプリケーション(補 1) • com.javafx.main.Mainクラスを調べる – システムプロパティjava.home – URLClassLoaderでApplication継承クラスをロー ドしmainメソッドを実行している。 ClassLoader urlClassLoader = new URLClassLoader(urls, null); : Thread.currentThread().setContextClassLoader(urlClassLoader); : Class appClass = Class.forName(appName, false, Thread.currentThread().getContextClassLoader()); : Method mainMethod = appClass.getMethod("main", new Class[] { new String[0].getClass() }); : mainMethod.invoke(null, new Object[] { args });