Dockerの使い方

イントロダクション

ラズパイにRedmineをインストールして使用しようと考えております。
しかし、記事を検索しながら、いろいろとやってみると、どれもこれもエラーがでて使えない。。。結局Dockerをちゃんと学習することにしました。

参考サイト

DockerDocsを参考にします。

タイトルは「Raspberry Pi OS (32 ビット) に Docker エンジンをインストールする」です。

Dockerとは?

いろいろと記事を斜め読みしてみると下のようなものということです。

Dockerはコンテナ仮想化を用いたOSレベルの仮想化によりアプリケーションを開発・実行環境から隔離し、アプリケーションの素早い提供を可能にする。

色々な説明があるけど、結局はこういうことだと思う。

つまり、「コンテナ」にまとめたアプリケーションを仮想マシンを使用して実行できる。ということらしい

Docker事始め

次のコマンドで、不要なもの、古いDockerをアンインストールします。もしかしたらインストールしているかもしれないからです。

よくあるのが、デフォルトインストールしているかもしれません。。。

for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

DockerのAPTリポジトリセットアップ

コードを書くと下のようになります。

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/raspbian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Set up Docker's APT repository:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/raspbian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

ラズパイを更新

下のコマンドで、ラズパイの更新します。

sudo apt-get update

コマンドのインストール

下のコマンドをインストールします。既にインストールしているときは「すでに最新バージョン」

  • ca-certificates
  • gnupg
  • curl
sudo apt-get install ca-certificates curl gnupg

Dockeraptリポジトリをセットアップ準備

GPGコマンドで暗号化・復号を行えるようにする?

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/raspbian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

Dockeraptリポジトリをセットアップ

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/raspbian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

最後に更新

sudo apt-get update

Dockerパッケージインストール

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

インストールできたら、起動確認「ハローワールド」を実行する

sudo service docker start
sudo docker run hello-world

Dockerコマンドを使う

Dockerをコマンドで扱うときの基本構文は下のようになっています。※こちらのページ参照

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

DocerFileを使う

こちらのページを参照しています。※英語だったので翻訳してみました。
下のようなコマンドがあるのでそれを使用するということらしい。。。
Dockerのコマンド入力の基本としてコマンド名は大文字、引数は小文字で書くようです。

docker ADD argument...
コマンド名 意味
ADD ホスト上のソースから、設定された宛先にあるコンテナー独自のファイルシステムにファイルをコピーします。
CMD コンテナー内で特定のコマンドを実行するために使用できます。
ENTRYPOINT は、イメージを使用してコンテナーが作成されるたびに使用されるデフォルトのアプリケーションを設定します。
ENV 環境変数を設定します。
EXPOSE 特定のポートを関連付けて、コンテナと外部の間のネットワークを可能にします。
FROM ビルド プロセスの開始に使用されるベース イメージを定義します。
MAINTAINER イメージ作成者のフルネームと電子メール アドレスを定義します。
RUN Dockerfile の中心的な実行ディレクティブです。
USER コンテナを実行する UID (またはユーザー名) を設定します。
VOLUME コンテナからホスト マシン上のディレクトリへのアクセスを可能にするために使用されます。
WORKDIR CMD で定義されたコマンドが実行されるパスを設定します。
LABEL Docker イメージにラベルを追加できます。

試しにコマンドを実行する

下のようにディレクトリを作成します。作成先は初期ディレクトリ(ユーザーのディレクトリ)から「dockerbuild」というディレクトリを作成しました。

mkdir ~/dockerbuild

Dockerfileを作成します。

nano Dockerfile

下の内容をコピペします。

FROM ubuntu:latest
MAINTAINER NAME EMAIL

RUN apt-get -y update
RUN apt-get -y upgrade
RUN apt-get install -y build-essential

Where NAME is your full name and EMAIL is your email address.

そして、以下のようにコマンドをたたきます。

docker build -t "NAME:Dockerfile" .


エラーがあるけど、イメージ作製はできているようです。

「NAME」には好きな名前を入れてよいです。最後の「.」を忘れないようにしましょう。

これができたら下のようなコマンドをたたきます。

docker images

使用できるイメージの一覧が表示されます。

OpenOfficeでCSV出力するマクロを作る

イントロダクション

こちらの記事で、DBを作成しようとしていますが、尾¥登録するデータをどうするかで悩んだ結果。

依然作成した「地域情報一覧ページのデータ」を登録しようという結論に至りました。

CSVファイルを作る

地域情報一覧ページを作成しました、このページを作成するのにJSで表示するデータを作りましいた。これは、スプレッドシートになっているのですが、これからCSVファイルを作りたいと思います。

その前に、作成したマクロを実行するボタンの作り方を残しておきます。

ボタンの作成方法

マクロのためにJREを設定する

OpenOffice(Calc)

オープンオフィスを使用して、VBA的なプログラムが使えるのでそれを使用してデータを出力します。まずはOpenOfficeのセットアップです。

Java32bitをインストール

OpenOfficeは、32ビットで動いているようです。なので64ビット版ではなく32ビット版のJREが必要になります。
こちらのリンクから、ダウンロードおよびインストールできます。

インストールしたら、ProgramFiles(x86)野は以下にJavaフォルダができるので、その中のJREを選択します。
メニューの「ツール」→「オプション」→「OpenOffice」→「セキュリティ」を選択します。

マクロの作成

「マクロ」というのは、短髪で動く処理のことを指します。C言語でも「マクロ」がありますが、これもすぐに呼び出すことができる便利なものです。

マクロは、下のように複数の言語を使用できるようです。

マクロ起動用のボタンを作る

上部のメニュー、「表示」→「ツールバー」→「フォームコントロール」でコントロールを開きます。
ボタンを追加して、マクロを登録します。

マクロを作る

とりあえずは、こんなところです。次は、CSVファイルを出力するマクロを作りたいと思います。

ここで、はじめに作成したコードをベースにCSVファイルを出力するコードを作成したいと思います。


Sub Main

MsgBox "Hello"

End Sub

現状では、「Hello」とポップアップで文言を表示するだけのプログラムです。上記の動画で使用しているものです。

OpenOffice Calc1のコード

エクセルVBAのように、コードを書くにはどのように書いたら良いか、まとめます。

まずは、変数定義から必要になります。

Dim oSheet AS Object
Dim oCell AS Object
Dim oCell2 AS Object

今回取得したいのは、シートとセルです。なので、それぞれの変数を用意します。

シートを取得する

ズバリ下のコードです。引数にあるのは、シート名です。

oSheet = ThisComponent.Sheets.getByName("pref_mst")

「pref_mst」シートを取得します。

セルを取得する

同様に、「C2」のセルを取得する。

oCell = oSheet.getCellrangeByName("C2")

このセルに値をセットしたいので、下のように書きます。

oCell.String = "aaA"
oCell2.Value = 12

シート名を取得する

シート名を「oSheet.Name」で取得、「oCell.String = 」で値をセットする。

oCell.String = oSheet.Name

現状のコード

とりあえずは、ここまでコードを書きました。こんな感じでCSVファイルを出力する予定です。

Sub Main

Dim oSheet AS Object
Dim oCell AS Object
Dim oCell2 AS Object

' ****************
' 練習用のコード
' ****************

oSheet = ThisComponent.Sheets.getByName("pref_mst")
'oCell = oSheet.getCellrangeByName("C2")
'oCell.String = "aaA" ' 文字列をセット
'
'oCell2 = oSheet.getCellrangeByName("C3")
'oCell2.String = oSheet.Name

' シート数だけシートを取得する
Dim oEnum As Object
oEnum = oSheet.createEnumeration()

While(oEnum.hasMoreElements())
    '' シート取得
    'セルを取得
End While
End Sub

シートの内容を取得

ここまで来たら、あとはシートの中身を取得してデータ(カンマ区切り)をCSVファイルに出力するだけです。

変更点

いきなりですが、シートを取得するのに「Enumeration」がうまく使えなかったので、FOR文に切り替えて処理を行うことにしました。
ファイル内にある、シートの数を取得するのに下のようなコードを使用しました。

' ファイルの取得
doc = ThisComponent
' シート数の取得
count = doc.getSheets().count
' 全シートの取得
shList = doc.getSheets()

<変更前>

ループをするのにWhile文を使用していました。

While(oEnum.hasMoreElements())
    '' シート取得
    'セルを取得
End While

<変更後>

For i = 0 to count
    ・
    ・
    ・
Next i

コードの実装

ファイル内の全シートを取得までは実装できたので、次は取得したシートからデータの取得を行います。

シートの取得とファイルオープン

下のように書きました。シートの取得はインデックス指定で行います。これはシート数までループする形で実装しました。
そして、出力するファイル名はシート名+".csv"で定義、ファイルを開き、「Print #fileNum, line」で行を追加していきます。「#fileNum」はファイルを開いた時の番号です。これを基準にしてファイルオープンしているオブジェクトを管理するのかな?

    ' シートの取得
    sheet = shList.getByIndex(i)
    ' 出力ファイル名
    fileName = root + sheet.Name + ".csv"
    ' ファイルを開く
    Open fileName For Output As #fileNum

1行のデータを取得する

ズバリ下のようなコードで書きました。

    ' 1行分のデータを取得してファイル出力
    tmp = sheet.getCellByPosition(cellRow, cellColumn).getString

「cellRow」はシートの行番号を示し。「cellColumn」は列番号を示します。
つまりループの1回目はそれぞれの値が(0, 0)の状態から処理を開始します。

繰り返しの条件

1シートにつき、データのある分だけループするので、「セルの中身が空だったら・・・」という条件でループしました。
結局は変数「tmp」をうまく使ってやるところです。ここが一番苦労しました。

While(tmp <> "")

最終的なコード

REM  *****  BASIC  *****

Sub Main

dim doc as object
dim count as Integer
dim shList as object
dim sheet as object

doc = ThisComponent
count = doc.getSheets().count
shList = doc.getSheets()

' シートを順に取得する
dim root as String
root = "C:\Users\tak45\OneDrive\ドキュメント\sampleCode\Gotochi\data\"
dim fileName as String

' セルのポジション
Dim cellRpw as Integer
Dim cellColumn as integer

Dim line as String
Dim tmp as String

cellRow = 0
cellColumn = 0

Dim fileNum as Integer
fileNum = Freefile()

for i = 0 to count
    ' シートの取得
    sheet = shList.getByIndex(i)
    ' 出力ファイル名
    fileName = root + sheet.Name + ".csv"
    ' ファイルを開く
    Open fileName For Output As #fileNum

    tmp = ""
    line = ""

    ' 1行分のデータを取得してファイル出力
    tmp = sheet.getCellByPosition(cellRow, cellColumn).getString
    if tmp <> "" then
        line = tmp + ", "
    else
        exit for
    end if

    cellColumn = cellColumn + 1
    While(tmp <> "")
        tmp = sheet.getCellByPosition(cellColumn, cellRow).getString 
        if tmp <> "" then
            line = line + tmp + ", "
            cellColumn = cellColumn + 1
        else
            Dim resCount as Integer
            resCount = len(line) - 2
            line = Left(line, resCount)
            cellRow = cellRow + 1
            cellColumn = 0
            Print #fileNum, line
            tmp = sheet.getCellByPosition(cellColumn, cellRow).getString 
            line = ""
        end if

    WEnd
    cellRow = 0
    'ファイルを閉じる
    Close #fileNum

    if i = 2 then
        exit for
    end if

next i

End Sub

でわでわ。。。

SQL*Plusの使い方~基本からCSVファイルからデータをインポートするまで~

イントロダクション

OracleDBが無料でインストールしました。次は、ユーザーなどを作成し、そこからSQLを使って色々とやりたいので、データをインポートしたいと思います。今回は、その手順を書くことにしました。

Sql*Plusを使用する

現状としては、OracleDBをインストールして、SqlDeveloperをインストールして操作を行おうと思ったのですが、結局はSqlPlusを使うのが一番手っ取り早いということになりました。

SQL*Plusの使い方

オラクルのDBをインストールしたら、付随してくるのがこの*SqlPlus**です。コマンドで実行できるので、GUIでの操作よりも簡単に操作できます。
どのように簡単化というと、権限(ロール)による操作の可能不可能で惑わされないということです。

では早速学習を始めましょう。

まずは、ログイン

DBサーバーにアクセスして操作する」というのが基本的なスタンスになります。なので、前提としてアクセスするサーバーの情報を以下のように設定します。

ユーザー名:takunoji
パスワード:passwd

次のコマンドが使えるようです。しかし、パスワードが丸見えなので。。。

sqlplus ユーザー名/パスワード

次のコマンドを使用します。

sqlplus ユーザー名

ログイン後のコマンド

これを実行したらパスワードの入力を促されるのでそこで入力

そして、現在の使用しているDBを確認するのに「show con_name」で表示されるのがDB名で、「CDB or PDB」を見分けられる。

SQL> show con_name

そして、ログアウト

SQL> exit

環境変数について

Linuxの場合は下のような環境変数が必要になりますが、Windowsの場合は、レジストリにある値が使用されます。レジストリの値はインストール時にセットされます。

  1. ORACLE_BASE: OracleDBのインストールした場所
  2. ORACLE_HOME: セットアップファイル(setup.exe)を展開したディレクトリ(フォルダ)
  3. ORACLE_SID: データベースの名前(orclなど)
    ※Linuxの場合は、PATHに「${ORACLE_HOME}/bin」を追加しましょう。

ユーザー、サーバー、DBを指定するログイン

ログインするときのコマンド

sqlplus ユーザー名@サーバーURL:ポート番号/対象のデータベース

これ祖実行するときは下のような感じです。

sqplust system@localhost:1521/xepdb1

プラガブルデータベースの「XEPDB1」は自動で作成されるPDB(プラガブルデータベース)です。

動画を作成しました。こんな感じです。

Sql*Plus起動後にDB接続

connect ユーザー名/パスワード as ロール

これを実行すると下のようになります。

connect sys/パスワード as sysdba

動画では下のようになります。

OracleDBの起動とシャットダウン

シャットダウンするコマンド

shutdown immediate

起動するコマンド

startup

動画では下のようになります。

プラガブルデータベースのみを停止

プラガブルデータベース(PDB)のみを停止する方法です。次のようなコマンドで実行します。

alter pluggable database <PDB名> close immediate

SQL*Loaderを使う

この部分は、まだ作成中です。

コマンドの実行

それで、CSVデータをインポートするのに、SQLLoderが使える事を知りました。SqlPlusと一緒にインストールされているようです。
次のコマンドが使用できます。

sqlldr control=ファイル名(パス)

インポート用のコマンド

そして、DBにデータをインポートするのには、下のようなコマンドを使用します。

sqlldr (ユーザー名)/(パスワード)@(接続識別子) CONTROL=(制御ファイルへのパス) LOG=(ログファイルへのパス) BAD=(エラーファイルへのパス) skip=(読み飛ばすヘッダー行数)」

CSVファイルを作る

詳細に関しては、こちらの記事を参照ください。OpenOfficeを使用して、マクロを作成しました。作成方法に関しても記述しています。

OracleDBにインポート

使用するクライアント・アプリケーションは「Sqpl*Plus」です。コマンドで実行するので、GUIみたいな煩わしさがなく、シンプルに実行できます。
この部分は、現在作成中ですので少々お待ちください。

でわでわ。。。

Mavenをちゃんと学習する

Apache Mavenを学習

Apache MavenはPOMファイルを使用して、依存関係を簡単に追加できます。単純にPOMファイルへ
下のような感じでXMLを記述してMavenをリロードすればJARファイルがダウンロードできてすぐに使えます。

        <!-- Additional dependencies required to use CUDA and cuDNN -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>opencv-platform-gpu</artifactId>
            <version>4.7.0-1.5.9</version>
        </dependency>

注意点として、dependencyタグはdependenciesタグに書く必要があります。

以前、Eclipseを使用してLWJGLというライブラリをインストールしました。Mavenプロジェクトをビルドする。Maven installを実行する。複数の方法でライブラリを追加できます。

Mavenのインストール

Apacheのサイトからダウンロードした圧縮ファイルを解凍します。解凍したら環境変数PATHに追加します。

解凍したフォルダ/bin

例えば、展開したフォルダの名前が「C¥maven」の場合は次のように追加します。

WindowsでPATH追加

コマンドプロンプトを起動して次のように入力

set PATH=%PATH%;C¥maven/bin;

LinuxでPATH追加

ターミナルで次のように入力

export PATH=$PATH:解凍したフォルダまでのパス/bin;

そして、

Mavenの基本

Apache Mavenのサイトを参考にします。
このページには「5分でわかる」とか書いているけど、とりあえず動くレベルだと思う。ここから学習を始めます。

  1. コマンドプロンプトを開き、適当なフォルダに移動します。
  2. そこで次のコマンドを実行します。
    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
  3. これでMavenプロジェクトが作成されます。

Windowsでmvnコマンドを実行する

ラズパイでmvnコマンドを実行する

こんな感じで、mvnコマンドで、プロジェクト作成などが簡単にできます。

Mavenスタートガイド

上のリンク先にはApacheのMavenプロジェクトサイトにある内容を学習します。

Mavenの主な機能

下に列挙したものが、その機能です。

  • ビルド
  • ドキュメンテーション
  • 報告
  • 依存関係
  • SCM
  • リリース
  • 分布

これらの機能を定義するのがPOMファイルです。これはProjectObjectModelの頭文字を取った感じです。

POMファイル概要

POMファイルはXMLファイルです。要素としては次のようなものがあります。

  • project: これは、すべての Maven pom.xml ファイルの最上位要素です。

project: これは、すべての Maven pom.xml ファイルの最上位要素です。

  • modelVersion: この要素は、この POM が使用しているオブジェクト モデルのバージョンを示します。モデル自体のバージョンが変更されることはほとんどありませんが、Maven 開発者がモデルを変更する必要があると判断した場合、使用の安定性を確保するために必須です。

  • groupId: この要素は、プロジェクトを作成した組織またはグループの一意の識別子を示します。groupId はプロジェクトの主要な識別子の 1 つであり、通常は組織の完全修飾ドメイン名に基づいています。たとえば、org.apache.maven.pluginsすべての Maven プラグインに指定された groupId です。

  • artifactId: この要素は、このプロジェクトによって生成されるプライマリ アーティファクトの一意のベース名を示します。プロジェクトの主な成果物は通常、JAR ファイルです。ソース バンドルなどのセカンダリ アーティファクトも、最終的な名前の一部として artifactId を使用します。Maven によって生成される一般的なアーティファクトの形式は、<artifactId>-<version>.<extension> (たとえば、myapp-1.0.jar) になります。

  • version: この要素は、プロジェクトによって生成されたアーティファクトのバージョンを示します。Maven はバージョン管理に大いに役立ち、SNAPSHOTプロジェクトが開発状態にあることを示す指定子がバージョンに表示されることがよくあります。このガイドでは、スナップショットの使用法とその仕組みについてさらに詳しく説明します。

  • name: この要素は、プロジェクトに使用される表示名を示します。これは、Maven が生成するドキュメントでよく使用されます。

  • url: この要素は、プロジェクトのサイトがどこにあるかを示します。これは、Maven が生成するドキュメントでよく使用されます。

  • properties: この要素には、POM 内のどこからでもアクセスできる値のプレースホルダーが含まれています。

  • dependency: この要素の子リストはdependency です。POM の基礎。

  • build: この要素は、プロジェクトのディレクトリ構造の宣言やプラグインの管理などを処理します。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>

  <name>my-app</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
       ... lots of helpful plugins
    </pluginManagement>
  </build>
</project>

アプリケーションのコンパイル

下のコマンドをたたきます。

mvn compile

Maven はコマンドを実行するために必要なすべてのプラグインと関連依存関係をダウンロードする必要があります。Maven をクリーン インストールした場合、これにはかなりの時間がかかる場合があります。

参考サイトには上記のような記述があります。つまるところは、「mvn install」を実行すると必要なプラグインなどをインストールするので時間がかかりますが、一度ダウンロードしてしまえば、ダウンロードの時間が無くなるので素早く処理ができます。ということです。

自動テスト

テストの事項を行うのには、下のコマンドで実行します。

mvn test

テストソースのコンパイルのみを行うときは

mvn test compile

依存関係のインストールなど

mvn install

Mavenリポジトリへ作ったモノを登録

mvn deploy

プラグインの使い方

POMファイルに下のような記述をします。「のような」という記述は、使用するプラグインによ記述内容が違うためです。

...
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.3</version>
      <configuration>
        <source>1.5</source>
        <target>1.5</target>
      </configuration>
    </plugin>
  </plugins>
</build>
...

ライフサイクルについて

「ライフサイクル」という単語は、「何かしらの処理が始まって終わるまでの流れ」を示します。Mavenであれば次のようなライフサイクルがあります。

ライフサイクルのフェーズ

  • validate- プロジェクトが正しく、必要な情報がすべて利用可能であることを検証します。
  • compile- プロジェクトのソースコードをコンパイルします
  • test- 適切な単体テスト フレームワークを使用して、コンパイルされたソース コードをテストします。これらのテストでは、コードをパッケージ化またはデプロイする必要はありません。
  • package- コンパイルされたコードを取得し、JAR などの配布可能な形式にパッケージ化します。
  • verify- 統合テストの結果に関するチェックを実行して、品質基準が満たされていることを確認します
  • install- ローカルの他のプロジェクトの依存関係として使用するために、パッケージをローカル リポジトリにインストールします。
  • deploy- ビルド環境で実行され、他の開発者やプロジェクトと共有するために最終パッケージをリモート リポジトリにコピーします。
実行してみた

デプロイについて

下のように設定を記述、リポジトリの用意が必要になりそうです。「なりそう」というのは「Gitリポジトリが使用できるかどうか?はまだわからないのではっきりしない言い方をしました。

  <distributionManagement>
    <repository>
      <id>mycompany-repository</id>
      <name>MyCompany Repository</name>
      <url>scp://repository.mycompany.com/repository/maven2</url>
    </repository>
  </distributionManagement>

ビルドフェーズは、プラグインの「GOAL」で構成

プラグインは、Maven に目標を提供するアーティファクトです。

参考サイトにこうありました。つまりは、Compiler プラグインには compileとtestCompile という 2 つの目標があります。
たとえば、Modello プラグインは、デフォルトでそのゴールをフェーズ「modello : java」にバインドします generate-sources(注 : 「modello : java」ゴールは Java ソース コードを生成します)。そのため、Modello プラグインを使用してモデルからソースを生成し、それをビルドに組み込むには、次のコードを のセクションのPOM に追加します

 <plugin>
   <groupId>org.codehaus.modello</groupId>
   <artifactId>modello-maven-plugin</artifactId>
   <version>1.8.1</version>
   <executions>
     <execution>
       <configuration>
         <models>
           <model>src/main/mdo/maven.mdo</model>
         </models>
         <version>4.0.0</version>
       </configuration>
       <goals>
         <goal>java</goal>
       </goals>
     </execution>
   </executions>
 </plugin>

POMファイル

pomファイルの基本的な記述内容です。つまりタグの意味を紹介します。

最小限のPOM定義

POM の最小要件は次のとおりです。

  • project: ルート
  • modelVersion: 最新の4.0.0に設定する必要があります
  • groupId: プロジェクトのグループの ID。
  • artifactId: アーティファクト (プロジェクト) の ID
  • version: 指定されたグループ内のアーティファクトのバージョン
<project>
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1</version>
</project>

POMの継承

下のように書いて継承することができます。project要素の子要素です。

  <parent>
    <groupId>com.mycompany.app</groupId>
    <artifactId>my-app</artifactId>
    <version>1</version>
  </parent>

POMファイルの変数

次のような形で変数を使用できます。

For example, ${project.groupId}, ${project.version}, ${project.build.sourceDirectory}

それを定義するのは「properties」タグです。

<project>
  ...
  <properties>
    <maven.build.timestamp.format>yyyy-MM-dd'T'HH:mm:ss'Z'</maven.build.timestamp.format>
  </properties>
  ...
</project>

特別な値もあるようです。※よくわかってないですが使えるようです。

  • project.basedir: 現在のプロジェクトが存在するディレクトリ。
  • project.baseUri: 現在のプロジェクトが存在するディレクトリ。URI として表されます。Maven 2.1.0以降
  • maven.build.timestamp: ビルドの開始を示すタイムスタンプ (UTC)。Maven 2.1.0-M1 以降

標準ディレクトリ構成

下のようになっています。

ディレクトリ名 対象
src/main/java アプリケーション/ライブラリのソース
src/main/resources アプリケーション/ライブラリのリソース
src/main/filters リソースフィルターファイル
src/main/webapp Web アプリケーションのソース
src/test/java テストソース
src/test/resources テストリソース
src/test/filters テストリソースフィルターファイル
src/it 統合テスト (主にプラグイン用)
src/assembly アセンブリ記述子
src/site サイト
LICENSE.txt プロジェクトのライセンス
NOTICE.txt プロジェクトが依存するライブラリに必要な通知と帰属
README.txt プロジェクトの Readme

最上位には、プロジェクトを説明するファイル、つまりpom.xmlファイルが表示されます。さらに、ユーザーがソースを受け取るとすぐに読めるように意図されたテキスト文書もあります: README.txt、LICENSE.txtなど。

依存関係の範囲(スコープ)

  • compile
    何も指定されていない場合に使用されます。コンパイルの依存関係は、プロジェクトのすべてのクラスパスで使用できます。さらに、それらの依存関係は依存プロジェクトに伝播されます。

  • provided
    これは によく似ていますcompileが、JDK またはコンテナが実行時に依存関係を提供することを期待していることを示します。たとえば、Java Enterprise Edition 用の Web アプリケーションを構築する場合、providedWeb コンテナがこれらのクラスを提供するため、サーブレット API および関連する Java EE API への依存関係をスコープに設定します。このスコープの依存関係は、コンパイルとテストに使用されるクラスパスに追加されますが、実行時クラスパスには追加されません。推移的ではありません。

  • runtime
    このスコープは、依存関係がコンパイルには必要ではなく、実行には必要であることを示します。Maven には、ランタイム クラスパスとテスト クラスパスにこのスコープの依存関係が含まれますが、コンパイル クラスパスには含まれません。

  • test
    このスコープは、アプリケーションの通常の使用には依存関係が必要なく、テストのコンパイルおよび実行フェーズでのみ使用できることを示します。このスコープは推移的ではありません。通常、このスコープは JUnit や Mockito などのテスト ライブラリに使用されます。また、Apache Commons IO などの非テスト ライブラリが単体テスト (src/test/java) で使用され、モデル コード (src/main/java) では使用されない場合には、これらのライブラリにも使用されます。

  • system
    このスコープは、それを含む JAR を明示的に提供する必要がある点を除けば、
    と似ています。providedアーティファクトは常に利用可能であり、リポジトリ内で検索されません。

  • import
    セクション内のタイプの依存関係でのみサポートされます。これは、依存関係が、指定された POM のセクション内の依存関係の有効なリストに置き換えられることを示します。これらは置き換えられるため、スコープが の依存関係は、依存関係の推移性の制限には実際には関与しません。

Maven エラー JavaFXのライブラリが読み込めない

OpenCVライブラリが読み込めない

module-info.javaでOpenCVライブラリが読み込めないのでエラーになりました。下のようなエラー内容です。

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project pi4j-example-javafx: Compilation failure: Compilation failure: 
[ERROR] /home/pi/projects/pi4j-example-javafx/src/main/java/com/pi4j/example/HelloCV.java:[8,18] package org.opencv.core is not visible
[ERROR]   (package org.opencv.core is declared in the unnamed module, but module org.opencv.core does not read it)
[ERROR] /home/pi/projects/pi4j-example-javafx/src/main/java/com/pi4j/example/HelloCV.java:[11,26] package javafx.embed.swing does not exist
[ERROR] /home/pi/projects/pi4j-example-javafx/src/main/java/com/pi4j/example/HelloCV.java:[28,19] package javafx.fxml does not exist
[ERROR] /home/pi/projects/pi4j-example-javafx/src/main/java/com/pi4j/example/HelloCV.java:[29,18] package org.opencv.core is not visible
[ERROR]   (package org.opencv.core is declared in the unnamed module, but module org.opencv.core does not read it)
[ERROR] /home/pi/projects/pi4j-example-javafx/src/main/java/com/pi4j/example/HelloCV.java:[30,18] package org.opencv.core is not visible
[ERROR]   (package org.opencv.core is declared in the unnamed module, but module org.opencv.core does not read it)
[ERROR] /home/pi/projects/pi4j-example-javafx/src/main/java/com/pi4j/example/HelloCV.java:[45,9] cannot find symbol
[ERROR]   symbol:   class FXMLLoader
[ERROR]   location: class com.pi4j.example.HelloCV
[ERROR] /home/pi/projects/pi4j-example-javafx/src/main/java/com/pi4j/example/HelloCV.java:[45,33] cannot find symbol
[ERROR]   symbol:   class FXMLLoader
[ERROR]   location: class com.pi4j.example.HelloCV
[ERROR] /home/pi/projects/pi4j-example-javafx/src/main/java/com/pi4j/example/HelloCV.java:[51,15] cannot find symbol
[ERROR]   symbol:   class OpenCvController
[ERROR]   location: class com.pi4j.example.HelloCV
[ERROR] -> [Help 1]

Mavenで下のコマンドを実行したときに出たエラーです。

mvn package

コンパイルするときにJARファイルはインストールできているのだが、読み込めない。。。

他にも下のようなエラーが出ました。

was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced -> [Help 1]

解決

以下の原因があったようです。

  1. キャッシュが更新されていない
  2. module-infoに読み込みを書いてない
  3. javafx-fxml, javafx-swingのバージョン指定が不適切

キャッシュをクリアする

下のコマンドで再度実行

mvn -U package

これで読込は動いた

module com.pi4j.example {
    // Pi4J MODULES
    requires com.pi4j;
    requires com.pi4j.plugin.pigpio;

    // SLF4J MODULES
    requires org.slf4j;
    requires org.slf4j.simple;

    //  JavaFX
    requires transitive javafx.graphics;
    requires transitive javafx.controls;
    requires transitive javafx.fxml;
    requires transitive javafx.swing;
    requires transitive javafx.base;
    // Add Modules
    requires java.desktop;
        // 3rd-party
    requires org.bytedeco.opencv.platform;
    requires org.bytedeco.javacv.platform;

    uses com.pi4j.extension.Extension;
    uses com.pi4j.provider.Provider;

    // allow access to classes in the following namespaces for Pi4J annotation processing
    opens com.pi4j.example to com.pi4j;
    exports com.pi4j.example to javafx.graphics;
}

バージョン指定

下の部分がバージョン指定のところです。「${javafx.version}」はプロパティ要素で定義している定数です。

<version>${javafx.version}</version>

javafx-fxmlは「11」が使用できないらしい。。。

POMファイル

下記のようにPOMファイルに定義したらコンパイルできた。

        <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-fxml -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>${javafx.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-swing -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-swing</artifactId>
            <version>17-ea+8</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.openjfx/javafx-base -->
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-base</artifactId>
            <version>${javafx.version}</version>
        </dependency>

module-info.java

/*-
 * #%L
 * **********************************************************************
 * ORGANIZATION  :  Pi4J
 * PROJECT       :  Pi4J :: EXAMPLE  :: Sample Code
 * FILENAME      :  module-info.java
 *
 * This file is part of the Pi4J project. More information about
 * this project can be found here:  https://pi4j.com/
 * **********************************************************************
 * %%
 * Copyright (C) 2012 - 2020 Pi4J
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */
module com.pi4j.example {
    // Pi4J MODULES
    requires com.pi4j;
    requires com.pi4j.plugin.pigpio;

    // SLF4J MODULES
    requires org.slf4j;
    requires org.slf4j.simple;

    //  JavaFX
    requires transitive javafx.graphics;
    requires transitive javafx.controls;
    requires transitive javafx.fxml;
    requires transitive javafx.swing;
    requires transitive javafx.base;
    // Add Modules
    requires java.desktop;
        // 3rd-party
    requires org.bytedeco.opencv.platform;
    requires org.bytedeco.javacv.platform;

    uses com.pi4j.extension.Extension;
    uses com.pi4j.provider.Provider;

    // allow access to classes in the following namespaces for Pi4J annotation processing
    opens com.pi4j.example to com.pi4j;
/*    opens com.pi4j.example to javafx.graphics;
    opens com.pi4j.example to javafx.controls;
    opens com.pi4j.example to javafx.fxml;
    opens com.pi4j.example to javafx.swing;
    opens com.pi4j.example to javafx.base; */
}