Azure PipelineでJavaFXを利用したアプリケーションをビルドする

はじめに

これは、現在開発中のTrinity+というデスクトップアプリケーションのビルドをAzure Pipelineで構築しようとした時に躓いたので、それに関する試行錯誤をまとめました。

前提

  • JavaFXアプリケーションのビルド&Javapackagerでのパッケージングをする
  • JDK8 (使用ライブラリがJDK8までしか対応していなかった)(多分JDK11でも同様にできるとは思う)
  • WindowsのVMImageを利用(javapackagerでWindows向けインストーラー作るにはWindowsである必要があるから。)
  • ビルドツールとしてGradle Wrapperを使用する

成果物

とりあえず完成品

ゴチャゴチャした説明とかいらないからとりあえずコピペして使える完成品をくれ!という人向け。
最新版はGitHubを参照。

trigger:  
- master  

pool:  
  vmImage: 'vs2017-win2016'  

steps:  

- bash: "curl -o jdk.7z -L $(jdk_win)"  
  name: 'dlJDK'  

- task: ExtractFiles@1  
  inputs:  
    archiveFilePatterns: '*.7z'   
    destinationFolder: 'jdk'  
  name: 'extractJDK'  

- bash: './gradlew installDist -Dorg.gradle.java.home=jdk'  
  name: 'build'  

- powershell: |  
    $env:PATH += (";" + $env:WIX + "bin")  
    jdk/bin/javapackager -deploy -outdir target -outfile Trinity+ -srcdir build/install/Trinity+/lib -appclass toliner.trinityplus.TrinityPlusApp -name Trinity+ -title Trinity+ -native installer -Bvendor=toliner -BsystemWide=false  
  name: 'package'  

- task: CopyFiles@2  
  inputs:  
    contents: 'target\**\?(*.exe|*.msi)'  
    targetFolder: '$(Build.ArtifactStagingDirectory)'  
    overWrite: true #Optional  

- task: PublishBuildArtifacts@1  
  inputs:  
    pathtoPublish: '$(Build.ArtifactStagingDirectory)'  
    artifactName: trinity-win  

利用方法

  1. Azure PipelineのBuildのyaml編集画面にコレを貼り付けます。
  2. 23行目のjavapackagerの引数を、自分のプロジェクト用のものに書き換えます。
  3. 最後の行のartifactNameをお好みの名前に書き換えます。
  4. Amazon Coretto 8をダウンロードします。
  5. Corettoを展開し、demoやsample等の不要なファイル/フォルダを消します。
  6. 圧縮されたアーカイブのルートにbinやjre等のフォルダが配置されるように7z形式でまとめて圧縮します。
  7. そのファイルへの直のダウンロードリンクを生成できる何かしらのファイルストレージ(DropBox等)に7zファイルをアップロードします。
  8. Azure PipelineのVeriableの編集画面にjdk_winという名前でアップロードしたファイルへのリンクを環境変数に登録します。
  9. Saveして走らせよう。

やっていること

  1. 指定したurlからCorettoをダウンロード
  2. 解凍
  3. Corettoのパスを指定してGradle Wrapperでビルド(javapackagerで依存ライブラリ群のjarが必要なのでinstallDist)
  4. PowerShellでjavapackagerを起動
  5. 完成したexeとmsiをビルド成果物用のフォルダにコピー
  6. 成果物をpublish

Publishされた成果物はReleaseパイプラインで煮るなり焼くなり好きにしてください。
俺はとりあえずDropBoxにアップロードしました。