【UoPeople】DockerでSwingアプリを動かす

UoPeopleではプログラミングをする必要があるコースがいくつかありますが、宗教上の理由でホストマシンに開発環境を入れることができないので、基本的にすべてDockerで開発しています。

現在CS1102というコースを受講していますが、JavaのSwingを使ったアプリを開発する必要があるのでDockerでの環境構築手順を残しておきます。

(正確にはJavaFXでもSwingでもどちらでも可なのですが、SwingはJava標準パッケージに含まれているらしいので楽かなと思い…)

コンソールアプリの場合はWindowsのホストマシンでDockerを動かすのでも問題ありませんが、GUIアプリですのでWSL2から動かした方が手っ取り早いです。なので以下はWSL2にログインしてから操作しています。

まずDockerfileです。

FROM eclipse-temurin:21

# 必要なパッケージのインストール
RUN apt-get update && apt-get install -y \
    libxext6 \
    libxrender1 \
    libxtst6 \
    libxi6 \
    libx11-6 \
    libxcomposite1 \
    libxcursor1 \
    libxdamage1 \
    libxfixes3 \
    libxrandr2 \
    libgtk-3-0 \
    libnss3 \
    libasound2t64 \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /usr/src

必要なパッケージのインストールというところはChatGPTに教えてもらったものをそのまま使っていますので、もしかしたら不要なものがあるかもしれません。正直、業務やプライベートでは使わないであろうJavaの課題のためにこれらのパッケージについて調べるのが面倒なので…。

続いてdocker-compose.ymlです。volumesの./src:/usr/srcの部分は環境に合わせてお好みに変更してください。

version: '3.8'

services:
  cs1102:
    build:
      dockerfile: ./Dockerfile
    volumes:
      - ./src:/usr/src
      # WSL
      - /tmp/.X11-unix:/tmp/.X11-unix
      - /mnt/wslg:/mnt/wslg
    tty: true
    environment:
      - DISPLAY=$DISPLAY
      - WAYLAND_DISPLAY=$WAYLAND_DISPLAY
      - XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR
      - PULSE_SERVER=$PULSE_SERVER

WSL2に入っていればenvironmentのところで設定している$DISPLAYなどの環境変数は何もしなくても設定された状態になっています。Windowsのホストマシンだと、$DISPLAYなどでは取得できないので、個別に値を調べて設定する必要があります。

これでビルドするのですが、私の場合はビルドするときに以下のエラーが発生しました。

error getting credentials

これを解消するためにvimなどで以下のファイルを開き該当行をコメントアウトします。

vim ~/.docker/config.json
{
  //"credsStore": "desktop.exe"
}

この状態でビルドします。

docker compose build

終わったら通常通りDockerを起動してコンテナに入ります。

docker compose up -d
docker ps
docker exec -it <CONTAINER_ID> /bin/bash

適当な場所に以下のHello.javaファイルを作成し、コンパイル、実行します。

import javax.swing.JOptionPane;

public class Hello {

  public static void main(String[] args) {
    JOptionPane.showMessageDialog( null, "Hello World!" );
  }
}
javac Hello.java
java Hello

無事に表示されました!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です