- 投稿日:2019-10-01T18:10:22+09:00
[OpenJDK11&JavaFX13]IntelliJ+gradleでjavaFXアプリをビルドし、軽量JREと合わせて配布可能なパッケージを作成する
配布可能なJavaFXアプリを作成したかったのですが、試行錯誤したのでこちらにまとめます。
環境
$ cat /etc/os-release NAME="Ubuntu" VERSION="18.04.3 LTS (Bionic Beaver)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 18.04.3 LTS" VERSION_ID="18.04" HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" VERSION_CODENAME=bionic UBUNTU_CODENAME=bionic ※macOS Mojave(10.14.6)でも同様の手順で作成できました。 $ java --version openjdk version "11.0.4" 2019-07-16 OpenJDK Runtime Environment (build 11.0.4+11-post-Ubuntu-1ubuntu218.04.3) OpenJDK 64-Bit Server VM (build 11.0.4+11-post-Ubuntu-1ubuntu218.04.3, mixed mode, sharing) $ jlink --version 11.0.4JDKの選定
最初はJavaFXを同梱しているAmazon CorrettoなどのJDKを使用しようと思っていました。
しかし、以下の記事を読んで、今回はOpenjdk-11を使用し、JavaFXはライブラリとして使用し、配布時に軽量JREを生成することにしました。
OpenJFX時代のJDK選び - もしくはOpenJFX時代のアプリケーション配布手順
IntelliJでgradleプロジェクトを作成
IntelliJで、新規gradleプロジェクトを作成します。
build.gradleにjavafx用の設定を追加
OpenJFXの公式サイトに記載されていた以下のソースを参考に、build.gradleを作成します。
https://github.com/openjfx/samples/blob/master/IDE/IntelliJ/Modular/Gradle/hellofx/build.gradleなお、IntelliJの設定でもともと設定で「Automattically import this project on changes in build script files」にチェックを入れていますので、よしなにモジュールはインポートされます。
build.gradleplugins { id 'java' id "org.openjfx.javafxplugin" version "0.0.8" // 追加 } group 'com.example' version '1.0-SNAPSHOT' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { testCompile group: 'junit', name: 'junit', version: '4.12' } // 追加 javafx { version = "13" modules = [ 'javafx.controls', 'javafx.fxml' ] } // 実行可能Jarを作成する際のMainクラスを指定 jar { manifest { attributes 'Main-Class': 'Main' } }テスト用のJavaFxクラスを作成
Main.javaimport javafx.application.Application; public class Main { public static void main(String... args){ Application.launch(MyApplication.class); } }MyApplication.javaimport javafx.application.Application; import javafx.stage.Stage; public class MyApplication extends Application { public MyApplication(){ super(); } @Override public void start(Stage primaryStage) throws Exception{ primaryStage.setTitle("Hello"); primaryStage.setWidth(300); primaryStage.setHeight(200); primaryStage.show(); } }buildして、実行可能JARファイルを作成
コンソールにて、
gradle build
を実行します。
特に問題がなければ、実行可能jarファイルが作成されるかと思います。
このように、javafx.application.Applicationクラスが無いよと怒られます。
これは、openjdk-11.0.4のjre内に、JavaFXモジュールが存在していないからですね。軽量JREを作成する
では、jlinkを使って今回のjarファイルを動作させるための軽量jreを作成していきましょう!
今回は、以下の記事を参考にさせていただきました。
配布用の軽量 JRE の作り方まず、以下ページのDownloadsより、jmodsをダウンロードします。
https://openjfx.io/
ダウンロードしたzipファイルを展開し、適当なパスに配置します。
(今回は、/usr/lib/jvm/javafx-13-openjfx/javafx-jmods-13
に配置しています。)なお、今回はLinux用jmodsをダウンロードしました。
※各実行環境のOSに合わせ、モジュールをダウンロードしましょう。次に、
jdeps ${jarファイルパス}
コマンドにて、今回のjarファイルを実行するために必要なモジュールを調べます。
今回は、以下のモジュールを使えば良さそうです。
・java.lang -> java-base
・java.application -> javafx.base
・javafx.stage -> javafx.controls※本当は、
jdeps --list-deps ${jarファイルパス}
とすると、どのモジュールを使えばよいかわかるようですが、何故かこのオプションが使用できず・・・。必要なモジュールがわかったので、軽量jreを作成します。
以下のjlinkコマンドで、上記のモジュールを指定して作成できました。$ jlink --compress=2 --module-path /usr/lib/jvm/java-11-openjdk-amd64/jmods:/usr/lib/jvm/javafx-13-openjfx/javafx-jmods-13 --add-modules java.base,javafx.base,javafx.controls --output jreカレントパスにjreディレクトリが作成されました。
jre/bin/java
のバイナリも作成されています。作成したJREを使用して、JARファイルを実行する。
では、最後に作成したjreを利用して、プログラムを実行してみましょう。
$ ./jre/bin/java -jar build/libs/javafx-sample-1.0-SNAPSHOT.jar無事に実行できました!
あとはJARファイルとjreをよしなにディレクトリにまとめ、実行用のシェルやbatファイルを作成するなり、appパッケージにまとめるなりすると完成です。
(以下は、フォルダにまとめ、シェルを作った例)$ ls javafx-sample-1.0-SNAPSHOT.jar jre start.sh $ cat start.sh #!/bin/sh BASE=$(cd $(dirname $0); pwd) $BASE/jre/bin/java -jar $BASE/javafx-sample-1.0-SNAPSHOT.jar ## sh start.shで実行可能お疲れ様でした!
初めてjlinkやjdepsなどのコマンドを使い軽量JREを作成しましたが、使用者の環境(jdkなど)に依存しないで実行できるJavaFXアプリを作る際は、この方法が簡単かなと思います。
なお、今回のjreディレクトリのサイズは368.3MBなので、もっと色々できるようにすると重たくなってしまうのかな?以上です。ありがとうございました!
- 投稿日:2019-10-01T17:58:10+09:00
【SpringBoot】プロジェクトの作り方(初心者向け)
今回やること
- SpringBoot + Java8 + gradle のプロジェクトを作成します。
- localhost:8080にクロームでアクセスしたら、「Hello World」を表示します。
環境
- IntelliJ
- Mac
- java8
Spring Initializrでプロジェクトの原型を作る
- Spring Initializrの公式ページを開きます。
- ここで自分に必要な要素を選択して作っていきます。
- 選択が完了したら、Generateボタンをクリックします。
- 自分の指定した場所にzipができるので、解凍します。
プロジェクトをIntelliJで開く
Hello Worldを表示する
- 初期で作られているSampleApplicationクラスには何も手を加えずに、
SampleApplicationクラスと同階層のディレクトリでControllerクラスを新規作成します。HelloController.java@RestController public class HelloController { @GetMapping("/") public String index() { return "hello world"; } @PostMapping("/") public String index2() { return "こんにちは"; }注意点
- thymeleafは不要です。
- コードに変更を加えた時は、「■(停止)」を押下しないと、
多重起動になるのでいちいち消してからRunしましょう「▶」。- RestAPIを作りたい時は、「@Controller」ではなく
「@RestController」をつけましょう。
- 投稿日:2019-10-01T14:29:11+09:00
【GradleでJakartaEE 8 アプリケーション開発】1. 環境構築
はじめに
私は業務でJakartaEE (Java EE) を使用したエンタープライズアプリケーションを開発しています。
これまでは参考書を読みながら学習し開発してきましたが、環境構築から開発手順までまとまっている、自分に合ったドキュメントがなかったので、今までの知識を連載形式でまとめていきたいと思います。環境
※2020年3月現在のバージョンをもとに選定しています。
項目 内容 OpenJDK ビルド Azul Zulu 11 フレームワーク Jakarta EE 8 APサーバ payara server 5.201 DBサーバ PostgreSQL 12 ビルドツール Gradle 6.2.2 IDE Eclipse 2020-03 (Pleiades All in One) OS Windows 10 1. 環境構築
OpenJDK 11 インストール
今回はAzul Zuluを使用します。
payara server 5.192からJava 11対応がされたため、OpenJDK 11としています。
https://jp.azul.com/downloads/zulu-community/?&architecture=x86-64-bit&package=jdk
上記リンクから、 Java 11 (LTS) の Windows 版 msi をクリックしダウンロードします。
ダウンロードしたMSIファイルを実行します。
Next をクリックし、インストールフォルダはデフォルトのまま、 Next をクリックします。
Install をクリックし、インストールを開始します。
インストールが完了すると下の画面が表示されますので、Finish をクリックします。
次に環境変数を設定します。
Windowsの設定にて「環境変数」と検索し、「システム環境変数を編集」を選択します。
下記のシステム環境変数を設定します。
下表の通り入力し、OK をクリックします。
変数名 変数値 JAVA_HOME C:\Program Files\Zulu\zulu-11 コマンドプロンプトを起動し、「java -version」を実行し下記の結果が表示されればインストール完了です。
別のJDKをインストールしている場合は上記の結果とならない場合があります。
その際はシステム環境変数の設定を開き、Pathの先頭が
C:\Program Files\Zulu\zulu-11\bin
となるように変更してください。
PostgreSQL 12 インストール
データベースサーバとしてPostgreSQLを使用します。
https://www.enterprisedb.com/downloads/postgres-postgresql-downloads
Windows x86-64 の 12.2 の Download をクリックしダウンロードします。
ダウンロードしたexeファイルを実行します。
Next をクリックし、インストールフォルダはデフォルトのままで、Next をクリックします。
コンポーネントもデフォルトのままで、 Next をクリックします。
データ保管先を指定します。開発用で特に希望がなければデフォルトのまま使用します。Next をクリックします。
管理ユーザ「postgres」のパスワードを入力します。入力したら Next をクリックします。
接続ポートを設定します。指定された番号がない限り、デフォルトのまま Next をクリックします。
ロケールを設定します。「C」を選択し、 Next をクリックします。
Summaryが表示されますので、Next をクリックします。
インストールが完了したら下の画面が表示されますので、チェックを外して Finish をクリックします。
以上でPostgreSQLのインストールは完了です。
payara server 5 インストール
Java EEアプリケーションサーバとして payara serverを使用します。
https://www.payara.fish/software/downloads/all-downloads/
ここではFullをインストールします。
Payara Server 5.201 (Full) Download をクリックすると、zipファイルがダウンロードされます。
Cドライブ直下にpayaraフォルダを作成し、その中にpayara-5.201フォルダを作成します。
※201の部分は今回のバージョンです
ダウンロードしたファイルを解凍し、解凍後のpayara5 フォルダをpayara-5.201フォルダ内に配置します。配置後のC:\payara\payara-5.201\payara5
フォルダの中身は下の画面のようになります。
次に、payara serverの初期設定を行います。
コマンドプロンプトを起動し、C:\payara\payara-5.201\payara5\bin
フォルダに移動します。payara serverを起動します。
asadmin start-domain
と入力し、実行します。c:\payara\payara-5.201\payara5\bin>asadmin start-domain Waiting for domain1 to start ...................... Successfully started the domain : domain1 domain Location: C:\payara\payara-5.201\payara5\glassfish\domains\domain1 Log File: C:\payara\payara-5.201\payara5\glassfish\domains\domain1\logs\server.log Admin Port: 4848 Command start-domain executed successfully.管理者ログインを行います。
asadmin login
と入力し、実行します。
ログインユーザはデフォルトのため空欄とします。
ログインに成功すると、[ユーザフォルダ]\.gfclient\pass
ファイルが作成されます。
※パスワード情報が含まれるバイナリファイルですc:\payara\payara-5.201\payara5\bin>asadmin login Enter admin user name [Enter to accept default]> Admin login information for host [localhost] and port [4848] is being overwritten with credentials provided. This is because the --savelogin option was used during create-domain command. Login information relevant to admin user name [admin] for host [localhost] and admin port [4848] stored at [C:\Users\[ユーザ名]\.gfclient\pass] successfully. Make sure that this file remains protected. Information stored in this file will be used by administration commands to manage associated domain. Command login executed successfully.管理者パスワードを変更します。
asadmin change-admin-password
と入力し、実行します。
ユーザ名はデフォルトのため空欄、パスワードは設定していないため空欄のまま進み、新パスワードを入力します。c:\payara\payara-5.201\payara5\bin>asadmin change-admin-password Enter admin user name [default: admin]> ←何も入力せずにEnterキーを押す Enter the admin password> ←何も入力せずにEnterキーを押す Enter the new admin password> ←新パスワードを入力しEnterキーを押す Enter the new admin password again> ←新パスワードを入力しEnterキーを押す Command change-admin-password executed successfully.再度、管理者ログインを行います。
asadmin login
と入力し、実行します。
ログインユーザはデフォルトのため空欄とし、パスワードは先ほど入力した新パスワードを入力します。
ログインに成功すると、[ユーザフォルダ]\.gfclient\pass
ファイルが更新されます。c:\payara\payara-5.201\payara5\bin>asadmin login Enter admin user name [Enter to accept default]> ←何も入力せずにEnterキーを押す Enter admin password> ←新パスワードを入力しEnterキーを押す Admin login information for host [localhost] and port [4848] is being overwritten with credentials provided. This is because the --savelogin option was used during create-domain command. Login information relevant to admin user name [admin] for host [localhost] and admin port [4848] stored at [C:\Users\[ユーザ名]\.gfclient\pass] successfully. Make sure that this file remains protected. Information stored in this file will be used by administration commands to manage associated domain. Command login executed successfully.管理コンソールを利用できるようにします。
asadmin enable-secure-admin
と入力し、実行します。c:\payara\payara-5.201\payara5\bin>asadmin enable-secure-admin You must restart all running servers for the change in secure admin to take effect. Command enable-secure-admin executed successfully.再起動を促されますので、payara serverを再起動します。
asadmin restart-domain
と入力し、実行します。c:\payara\payara-5.201\payara5\bin>asadmin restart-domain Successfully restarted the domain Command restart-domain executed successfully.Webブラウザを起動し、
http://localhost:8080/
にアクセスし、下の画面が表示されるかを確認します。
https://localhost:4848/
にアクセスし、管理コンソールのログイン画面が表示されるかを確認します。
ログイン画面で User Name (上段) に admin 、Password(下段)に先ほど設定したパスワードを入力し、
ログインに成功し下の画面が表示されたらpayara serverのインストールと初期設定は終了です。
Gradle インストール
最新版をダウンロードします。
https://gradle.org/releases/
リンク先画面の下部にある、v6.2.2の binary-only のリンクをクリックし、zipファイルをダウンロードします。
Cドライブ直下にgradleフォルダを作成します。
ダウンロードしたファイルを解凍し、解凍フォルダ内のgradle-6.2.2フォルダをgradleフォルダ内に配置します。配置後のc:\gradle\gradle-6.2.2
フォルダの中身は下の画面のようになります。
環境変数を設定します。
Windowsの設定にて「環境変数」と検索し、「システム環境変数を編集」を選択します。
下記のシステム環境変数を設定します。
下表の通り入力し、OK をクリックします。
変数名 変数値 GRADLE_HOME C:\gradle\gradle-6.2.2 システム環境変数のPathを追加します。
Pathを選択し、編集 をクリックします。
新規 をクリックし、「%GRADLE_HOME%\bin」と入力し、 OK をクリックします。
環境変数の編集画面を閉じた後にコマンドプロンプトを起動し、「gradle -version」を実行し下記の結果が表示されればインストール完了です。
Eclipse インストール・初期設定
こちらも最新版をインストールします。(Java の Full Editionが良いと思います)
http://mergedoc.osdn.jp/ダウンロードしたzipファイルを解凍し、pleiadesフォルダをCドライブの直下に配置します。
※解凍は7-zipを使用して実施してください。配置したら、
c:\pleiades\eclipse\eclipse.exe
をダブルクリックして Eclipse を起動します。ワークスペースを選択し Eclipse が起動したら、ヘルプ > Eclipse マーケットプレース を選択します。
Eclipse マーケットプレース が起動したら、「payara tools」と入力し Enter キーを押し、検索結果から payara tools をインストールします。
次のダイアログが表示された場合は、 インストール をクリックします。
インストール完了後、Eclipseを再起動します。
再起動が完了したら、ウィンドウ > 設定 を開き、 サーバ > ランタイム環境 を選択し、開発サーバの設定を行います。
追加 をクリックします。
Payara を選択し、次へ をクリックします。
Payara Location に payara server のインストールフォルダを設定し、JavaロケーションにJDKのインストールフォルダを設定し、完了 をクリックします。その後、適用して閉じる をクリックし、設定ダイアログを閉じます。
Payara > Payara をクリックし、次へ をクリックします。
サーバービュー に Payara Server が追加されます。
以上で環境構築を終了します。
次章では、プロジェクトの作成作業を行います。
- 投稿日:2019-10-01T13:55:49+09:00
【体験記】Java SE 8 Silverに合格しました
9/21に合格したので忘れないうちに体験記を書き残しておきます。
試験結果:
勉強期間: 約4週間
得点率:88%(合格ライン65%)受けた理由
現在通っている職業訓練校が実施している企業説明会にて、「就職活動をするにあたって持っておいた方がいい資格はなんですか?」と質問すると、どの企業も口を揃えて「JavaSilverを取っているとそれだけで一段抜ける」
「あと基本情報技術者試験も」との事だったので、同期から一段抜ける為取得する事に決めました。受けると決めた時のJava知識
- Java言語を使用したSES経験あり(研修期間含め4か月で辞める)(現場経験0)(ダメ人間)
- なんかStrutsとかSpringとかあるんだよね~、DI?なにそれ?
- 継承、ポリモーフィズム、カプセル化は知ってるつもり、ただポリモーフィズムは実装出来る気がしない。
- String型がInt型やLong形となんか違うみたいなのは覚えてるとかその程度。
- ラムダ式?使いたいけど全然分からない…。
勉強方法
恥ずかしながらこれまでまともに勉強をしたことがなかったので、ネットで色々調べた結果、「黒本買って3週くらい問題解いたらいいんだ」と結論付けて実行することに。
徹底攻略 Java SE 8 Silver 問題集[1Z0-808](通称"黒本")
8/25、黒本がAmazonから届き、慣れていない資格勉強が始まりました。
勉強期間の間は、自宅にて1日1~3章解くことに集中し、1週間の終わりに1度模擬Aを解く。
これを3回繰り返しました。(電車内勉強チャレンジもしてみたのですが、集中できなかったので1回でやめました)模擬Aの点数
1週目模擬A:45/77
1週目の時は色んなところからボコボコにされて、「自分はJavaのことを知ってるようで全く知ってなかったんだなぁ」と思い知らされてしまいました。
若干凹みつつ、1週目に理解出来なかった問題を解けるように注目しながら2週目に取り掛かりました。2週目模擬A:57/77
あまり点数は伸びませんでしたが、苦手だった問題が解けていたので「このまま勉強してればいけるのでは?」となんとなーく思っていました。
若干喜びつつ、今度は全体的な復習を意識しながら3週目に取り掛かりました。3週目模擬A:65/77
凄くいけるような気がしてきたので、ここで1週間後に受験申し込みをすることに。
面倒な申し込みをクリアしつつ、残り1週間はとにかく模擬A・Bを解きまくることに専念していました。最終的な模擬の点数
* 4週目模擬A:69/77
* 模擬B:65/77根拠はありませんが、もう行ける気しかしません。(のんき)
試験当日
張り切りすぎて開始1時間前に試験会場に到着し、近くのドトールで30分ずっと黒本とにらめっこしていました。
30分前に試験会場に入り、受付を済まし顔写真を撮られ、椅子に座って待っていました、この時の気分は処刑を待つ受刑者でした、怖かった。肝心な試験の内容は、噂通り黒本模擬A・Bの問題と酷似したものが多数を占めていました。
試験終了後、10分で結果がメールで届きました。
得点率:88%(合格ライン65%)で合格でした、まさかのガッツポーズが出ました。間違えた内容
- superとthisを使用したコンストラクタのアクセス
- whileループについて
- コンストラクタの作成およびオーバーロード
- 多態性の使用方法
- 文字列の作成と操作
今見ても理解は出来ているので、結構凡ミスが多かったようです。
これを見ているJava Silverを受験する方は注意してくださいね(?)まとめ
結局、一番ネックなのは受験料でした。26,600円はつらい…
しかし、自分みたいなJava歴1年未満でも3週間勉強していれば取れるくらいなので、お金に余裕がある方は是非取ることをお勧めします、特にJavaを覚えて就職活動をする予定の方は特にお勧めします。
次の目標は基本情報技術者試験です、ガンバルゾー。
- 投稿日:2019-10-01T13:31:00+09:00
Android studio-Fragmentに関して
Fragmentに関して昔の教則動画を見たら、またいろいろと更新されたようで、ここで記録しておきます。
Import fragment package
package com.example.fragment; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class TopSectionFragment extends Fragment{ @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { //convert xml file to View object; parent=parameter ViewGroup container of the method //you can use layoutInflater directly with the parameter of inflater View view=inflater.inflate(R.layout.top_section_fragment,container,false); return super.onCreateView(inflater, container, savedInstanceState); } }まずFragmentのインポートルートは上記になりました。
Androidxに移転したSupport系のパッケージはこちらのリンクで調べてみてください。
https://developer.android.com/jetpack/androidx/migrate/artifact-mappingsAndroidxへの乗り換えに関しました。下記リンクで説明が見られます。
https://developer.android.com/jetpack/androidx/migrateFragmentをActvityでpreviewしたい場合
Android studio 3.x verから直接Fragmentをプレビューできなくなったようで、
Actvityのxmlにtools:layout=を入れないといけません。<!--adding tools:layout=@layout/fragmentXmlFileName to preview the fragment--> <fragment android:id="@+id/fragment3" android:name="com.example.fragment.TopSectionFragment" android:layout_width="350dp" android:layout_height="200dp" android:layout_marginStart="28dp" android:layout_marginTop="16dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:layout="@layout/top_section_fragment" />以上は覚書です。
- 投稿日:2019-10-01T12:09:47+09:00
Javaで税率を返すメソッドを作成する
消費税率が 8% から 10% になりました。
税率は
public static final double TAX_PERCENT = 0.08;みたいに定数として持たせると危険です。
2014年04月 8%
2019年10月 10%のようにして税率は変わってきており、今後も増税のタイミングが発生することが予想されます。
このように日時によって税率が変わるため、以下のように税率を返すメソッドを用意するのがおすすめです。
public static final double EIGHT_TAX_PERCENT = 0.08; public static final double TEN_TAX_PERCENT = 0.10; public static final String TEN_TAX_PERCENT_CHANGE_DAY = "2019-10-01 00:00:00"; public static double getTaxPercent() { try { Date now = new Date(); SimpleDateFormat sdformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date dateTime = sdformat.parse(TEN_TAX_PERCENT_CHANGE_DAY); return now.getTime() >= dateTime.getTime() ? TEN_TAX_PERCENT : EIGHT_TAX_PERCENT; } catch (ParseException e) { System.out.println(e); } // きっと永遠にこない return 0; }