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:ポート番号/対象のデータベース

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

sqplus system@localhost:1521/xepdb1

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

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

プラガブルデータベースにアクセス

一度DBを切断して、再度アクセスします。

sqlplus system@localhost:1521/xepdb1

ユーザーの確認

下のSQLで一覧できます。

select username from all_users;

上のSQLでユーザーを確認したところ、作成したテストユーザーがいないので改めて作成します。

ユーザーの作成

ユーザー作成のSQL構文は以下の通りです。

CREATE USER ユーザー名 IDENTIFIED パスワード

それでは、実際に作成してみます。

ユーザ―に権限を付与します

各種権限がないと何も操作ができません。。。

  1. SESSION権限
    CREATE SESSION権限は、データベースに接続を許可するシステム権限です。

    grant create session to test;
  2. RESOURCE権限

    そのユーザーに関連付けられたスキーマで特定タイプのスキーマ・オブジェクトの作成、変更および削除を可能にします。このロールは開発者やスキーマ・オブジェクトの作成が必要なその他のユーザーにのみ付与されます。このロールにより、オブジェクト・システムの作成権限のサブセットが付与されます。たとえば、CREATE TABLEシステム権限は付与されますが、CREATE VIEW権限は付与されません。付与できる権限は、CREATE CLUSTER、CREATE INDEXTYPE、CREATE OPERATOR、CREATE PROCEDURE、CREATE SEQUENCE、CREATE TABLE、CREATE TRIGGER、CREATE TYPEのみです。

    grant resource to test;
  3. UNLIMITED TABLESPACE権限
    全ての表領域に対するサイズ無制限の表領域割当制限を付与する

    grant unlimited tablespace to test;

Sql*Plus起動後にDB接続

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

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

connect sys/パスワード as sysdba

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

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

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

shutdown immediate

起動するコマンド

startup

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

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

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

alter pluggable database <PDB名> close immediate

パスワードを忘れたとき

まずは、管理者権限でログインします。管理者のパスワードを忘れているとできません。。。

  1. sqlplusを起動する
    sqlplux /nolog
  2. SYSDBAでDBにアクセス
    connect sys as sysdba
  3. ユーザー一覧を確認する
    <全ユーザー>

    select username from all_users;
    select username from dba_users;
ALTER USER account IDENTIFIED BY password ACCOUNT UNLOCK;

SQL*Loaderを使う

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

コマンドの実行

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

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

インポート用のコマンド

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

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

CSVファイルを作る

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

OracleDBにインポート

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

でわでわ。。。

Oracle DBを使ってみる~DBをインストール~

イントロダクション

最近は、統計学が流行っているようです。そんなわけでちょっと勉強しました。

勉強したら、今度は実践してみたくなるのが人情。。。大量のデータを保存取り出しをするならデータベースを使用できます。そして、オラクルのデータベースが無料で使用できます。なのでオラクルのデータベースをインストールします。

今回ダウンロードするデータベースはOracle Database Express Edition (Oracle Database XE)です。

ついでなので、オラクルDBの学習もしてしまおうということになりました。

データベースとは

データベースは略して「DB(デービー)」と書きます。日本字は「ディー」と「ビー」をよく聞き違えるので、古い人(自分)は「デー」と発音します。
データベースに関して、明確に言うならば、データベースサーバーというのが正しい言い方になります。こちらのページにも記載しましたが、「サーバー」は「常駐アプリ」のことを言います。特定のPCを指す言葉ではありません。「サーバーマシン」つまり「サーバーアプリを起動(する)しているPC」のことを「サーバー」と呼んだりしますが、正しくは「サーバーマシン」です。

同じ言葉で別なものを指すことが多いので、とても間違えやすいので、注意しましょう。

余談ですが、「サーバー(アプリケーション)」には下のように、いくつかの種類があります。

  1. ファイルサーバー
  2. メールサーバー
  3. DBサーバー
  4. ウェブサーバー
  5. ストリーミングサーバー

などのものがあります。どれもサーバーですし、常駐アプリケーションです。これらの「サーバーアプリケーション」を動かしているPC、つまり「マシン」、は「サーバーマシン」です。

全て「サーバー」と呼ばれることがあります。注意しましょう

明確に言うならば、『本来は「サーバー」というのは常駐アプリケーションの事を言っていたけど、サーバーを動かすマシンも、アプリケーションもサーバーというようになった。』ということです。

Oraccle(オラクル)のデータベース

無料でダウンロード、インストールできる、オラクルのDBは「Oracle Database Express Edition (Oracle Database XE)」という名前です。
このデータベースをインストールします。左のリンクからダウンロードページに移動できます。

ダウンロードしたら、Windowsではインストーラーでインストールできます。

リレーショナルデータベースとは

下のようなテーブル表にデータを保存・管理してSQLというプログラミング言語でデータの取得、操作を行えるサーバーです。
ちょっと見ずらいですが、横の黄色が「行(ROW)」で、縦の緑が「列(COLUMN)」です。

SQLのサンプル

SQLは下のような構文を持っています。大まかにの処理があり、古い言い方かもしれませんがCRUD(クラッド)といい、以下の処理のことを言います。

  • Create: INSERT文を使用してデータを作成する
  • Read: SELECT文を使用してデータを読み取る、取得する
  • Update: UPDATE文を使用してデータを更新する
  • Delete:DELETE分を使用してデータを削除する

この4つの文が使えれば、SQLは大体使えることになります。ここから条件(WHERE句)や、並び替え(ORDER BY)や、集計のためにグループ分け(GROUP BY)などを行います。

注意点

インストールするときに、配置するフォルダや構成など、重要なところですので、インストール時には次のことを注意しましょう。

  1. インストールするときに、パスワードを入力します。このパスワードは忘れないようにしておきましょう。
    接続するときのユーザー「SYSTEM」のパスワードになります
  2. オラクルのインストール先ORACLE_HOMEを決めておきましょう。この場所にオラクルのインストーラーなどを配置します。
    つまり、ダウンロードしたインストールファイルなどの展開先がORACLE_HOMEになるということです。

データベースをインストール

これから、オラクルのデータベース(DB)をインストールします。注意してほしいのは、データベース=サーバーということです。
明確に言うならば、クライアントアプリケーションなどを使わないと、中にあるデータなどを閲覧できません。

なので、クライアントアプリケーションの紹介もしておきます。

ちなみに、オラクルは「マルチテナント・アーキテクチャ」を使用しているようです。早い話が「DBを複数保持する形」をとっています。
この複数のDBを管理するDBのことを「コンテナーデータベース(CDB)」と呼びます。それに対して、通常使用するデータベースのことを「プラガブルデータベース(PDB)」と呼びます。

Sql*Plusの紹介

オラクル・データベースをインストールしたら一緒についてくるアプリケーションです。この記事では、このアプリケーションを使用します。

SqlDeveloperの紹介

データベース・サーバーにアクセスして、データを見やすいGUIで操作できる、ソフトウェアもあります。

下にこちらのページにある内容を記載しておきます。

  • Oracle SQL Developerのスタートアップ。
  • ツールの左側にある接続ナビゲーター内の接続の上で右クリックします。
  • 新しいデータベース接続を選択します。
  • 次の情報を入力します:
  • 接続名: XE
  • ユーザー名: 作成したユーザー、またはSYSまたはSYSTEM(まだユーザーを作成していない場合)
  • パスワード: ユーザーのパスワード、またはSYSおよびSYSTEMに入力したデフォルトのパスワード
  • ホスト名: 127.0.0.1 XEがインストールされているのと同じマシンでSQL Developerを実行している場合、これはホスト名にすぎません。
  • ポート: 1521
  • SID: XE

    あと環境変数などの設定もいるようです。こちらのページを参考にしました。


インストールの手順

ダウンロードした、インストールファイルを展開したら、そこがORACLE_HOMEになります。
明確に言うならば、ORACLE_HOMEを自分で決めて、そこにインストールファイルを展開します。すると、そこがORACLE_HOMEになります。

どちらも極端な言い方だったかもしれません。。。

はじめの画面

上記で作成(展開)したORACLE_HOMEにあるセットアップファイル(setup.exe)を「管理者として実行する」で実行します。

使用許諾

使うためには、「同意」するほかありません。。。

イストールフォルダの指定

パスワードの設定

パスワードは忘れないようにしましょう。

設定内容の確認<重要>

ここで、ORACLE_HOMEORACLE_BASEの確認ができます。

インストール完了

ここでも、重要な情報が表示されるので、忘れないようにしましょう。
内訳としては、以下の通りです。ブラウザで参照できるようです。「https」がついていないのはプログラム(Java言語やPHP言語からアクセスするのに使用するURI)です。

URI(URL)
マルチテナント・コンテナデータベース:localhost:1521
プラガブル・データベース:localhost:1521/XEPDB1
EM Express URL:https:localhost:5500/em

Javaでアクセスる場合

URIの設定が上記の場合です。デフォルトがポート番号「1521」なんでしょうね~。

Connection conn = DriverManager.getConnection(
    "jdbc:oracle:thin:@localhost:1521:ORCL"// 接続URI
    , "ユーザー名" // ユーザー名を指定する
    , "パスワード");// パスワードを指定する

接続した後に、Statmentクラス、PreparedStatementクラスを使用してSQLを実行します。

<thinドライバーを使用する場合>
俗に言うデータソースを使用するってことです。最近はこの「データソース」を使用する方が多いのかな?

PoolDataSource  pds = PoolDataSourceFactory.getPoolDataSource();

pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
pds.setURL("jdbc:oracle:thin:@//localhost:1521/XE");
pds.setUser("<user>");
pds.setPassword("<password>");

Connection conn = pds.getConnection();

アクセスした後

Java言語では「Connectionクラス」を取得してしまえば、あとはSQLで操作ができます。
基本的には「Statmentクラス」でデータをSELECT, INSERT, UPDATE, DELETEができます。

しかし、たくさんのデータを操作したい場合は「PreparedStatement」を使用します。

conn.createStatement();
   or
conn.conn.prepareStatement(sql);

上記の「sql」には実行するSQLをセットします。例えば下のようにSQLをセットします。

String sql = "SELECT * FROM MY_TABLE WHERE ID = ?";
PreparedStatement pstmt = conn.conn.prepareStatement(sql);
pstmt.setInt(1, 12);// IDがNUMBER型の場合
pstmt.setString(1, "0012");// IDがCHAR、VARCHAR型の場合

EM Expressを使う

Enterorise Manager Database Expressはブラウザでアクセスできるウェブサーバーです。なので「"https://localhost:5500/em"」にアクセスし手表示します

「https」なので注意しましょう。

コンテナデータベース(CDB)にアクセス

ユーザー名:SYSTEM
パスワード:登録したパスワード
コンテナ:未入力

プラガブルデータベース(PDB)にアクセス

PDBは自動で作成してくれるようです。

ユーザー名:SYSTEM
パスワード:登録したパスワード
コンテナ:XEPDB1

SqlPlusで操作

コマンドでSqlPlusを実行してみます。
まずは、管理用のDB=CDBへアクセスします。元々いるユーザーの「SYSTEM」を使用しました。

sqlplus system/パスワード as sysdba

SQL*Plus: Release 21.0.0.0.0 - Production on 火 10月 17 16:44:21 2023
Version 21.3.0.0.0

Copyright (c) 1982, 2021, Oracle.  All rights reserved.

Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0
に接続されました。
SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

「CDB$ROOT」が管理用のDBであることを示します。

そして、デフォルトであるPDB=名前は「XEPDB1」に移動します。

SQL> alter session set container = XEPDB1;

セッションが変更されました。

SQL> show con_name

CON_NAME
------------------------------
XEPDB1

テーブルの作成

前提として、PDBでの操作になります。CSBだとユーザーが作成でき内容です。

表領域の作成

「パス指定」の部分は、インストールした「ルート」にしてもよいかもしれません。
とにかくデータファイルを置くのに適した場所にするのが良いということです。

下のコードは「TESTSPACE」というテーブルスペースを作成しています。

###スペース作成
CREATE TABLESPACE TESTSPACE
DATAFILE 'パス指定\TEST.dbf' SIZE 100M
SEGMENT SPACE MANAGEMENT AUTO;

テンポラリーテーブルスペースの作成

同様に「TESTTEMP」というテンポラリーテーブルスペースを作成しています。

###テンポラリスペース作成
CREATE TEMPORARY TABLESPACE TESTTEMP
TEMPFILE 'パス指定\TESTTEMP.dbf' SIZE 100M
AUTOEXTEND ON;

ユーザーの作成

###ユーザー作成
CREATE USER ユーザー名
identified by パスワード
default tablespace TESTSPACE
temporary tablespace TESTTEMP;

パスワードの部分は「"(ダブルクォーテーション)」で囲わないとエラーになる。

権限の付与

「connect」「resource」「dba」の権限をセットしています。

###権限付与
    grant connect to ユーザー名;
grant resource to ユーザー名;
grant dba to ユーザー名;

ユーザー名の確認をするのには下記のSQLを実行します。

select username from dba_users;
  or
select username from user_users;

パスワードの変更方法は以下の通り、「'(シングルクォーテーション)」ではパスワードに使用可能な文字の為エラーになる。

alter user takunoji identified by "パスワード";

ユーザーが作成出来たら、テーブルを作成していきます。

県マスタテーブルの作成

テーブルの作成は、CREATE TABLE文で作成します。イメージとしては下のようなものです。
主キーとして使用するのは「県ID(数値型」です。

県ID 県名
1 北海道
2 青森
3 宮城
4 岩手
SQL> create table pref_mst (pref_id number not null, pref_name varchar(20), primary key (pref_id));

表が作成されました。

テーブルを作成したら、コミットしましょう。

commit;

これをやらないと、ログアウトしたらテーブルが残っていません。。。

SQL Developper

SQL Developperをインストールするために、オラクルのアカウントが必要です。ちなみにJava言語で作成されています。おそらくJava Swingで作られています。
SQL Developperをインストールする

如何せん、SqlDeveloperの使用方法がイマイチなのでSqlPlusを使用しています。

SQL Developperについて

「SQL*Plus」というコマンドベースのアプリケーションをGUI(グラフィカルユーザーインターフェース)を使用して動かせるようにしたもので、「参照、作成、編集と削除」=CRUD(クラッド)操作を行うことができます。
また、MySQLと、Microsoft SQL Server、Sybase Adaptive Server、IBM DB2など特定の(Oracle以外の)サード・パーティ・データベースにもアクセスすることができます。
上記にあるように、DBサーバーへアクセスするクライアントアプリケーションであるSQL Developperは、当たり前ですが、DBサーバーへアクセスする必要があります。

ドキュメントはユーザーガイドを見ながら学習します。

SQL Developperを使う

ダウンロードしたSQL Developperを起動します。ユーザーガイドはこちらのページにあります。

DBサーバーである「Oracle Database Express Edition (Oracle Database XE)」をインストール済みであることを前提としています。

SQL Developperの起動

上記の「こちらのページ」からZIPファイルをダウンロードしたら任意のフォルダで展開します。
すると、下のようにファイルがありますので「sqldeveloper.exe」をダブルクリックして実行します。

そして、実行すると下のような「ようこそ」画面が見れます。

DBへの接続

SQL DevelopperはDBに接続するためのクライアントアプリケーションです。これでDBに接続して、テーブル(表)を作成したり、データを登録したりします。参考にしたページはこちらのページです。

上のボタンを押下すると下のようなダイアログが開きます。ここに下のような入力を行います。

  1. 接続情報の入力部分
  2. DBサーバーへの接続情報

2の「DBサーバーへの接続情報」は

  • ユーザー名:SYSTEM
  • パスワード:Oracle Database XEをインストールしたときのパスワードです。

接続すると下のように、すでに作成されているテーブル(DBサーバー管理用のテーブル)を一覧できます。

ちょっと注意

この状態では、管理テーブルになるので操作するため、もともとの目的に使用することに使えません。
なので、下のようにユーザー追加を含めDB作成を行います。

操作するためのDB作成

引き続き、SQL Developperを起動した状態で、次はユーザー登録を行います。デフォルトでは「SYSTEM」というユーザーが使用できますが、Linuxでいうスーパーユーザーなので、通常のユーザーを作成して使用するのが良い方法なので、そのようにします。

  • スーパーユーザーは何でもできるので間違ってもそれが動く
  • 通常のユーザーは権限が絞られるので、ほかに影響のある捜査はできないので安全

ユーザーロールについて

DBのユーザーを追加するのに下のようなSQLを使用します。

CREATE USER "ユーザー名" IDENTIFIED BY "パスワード"

これを実行するのが下のような操作です。

// TODO[ユーザーの追加操作動画を追加する]

ロール指定時のエラー

ユーザー登録時に、下のようなエラーメッセージが出ました。

権限のエラー

ORA-65096: 共通ユーザーまたはロール名が無効です

これは、SQL Developperを起動するときに、管理者で実行するを選択して実行すればOKです。

ORA-01935: ユーザー名またはロール名がありません。

設定のエラー

次は、こちらです。

ORA-65016: FILE_NAME_CONVERTを指定する必要があります


これは、上のように「カスタム名」を選択してやればOKでした。

操作用のDBを表示する

上記のエラーを乗り越えると、下のような画面が見れます。

PDB(プラガブルデータベース)、オラクルの使用で、DBサーバーを管理するためのDBと操作するためのDBと分けているようです。
コンテナDBとその上にのるプラガブルDBの2種類があるということです。
イメージは下のような感じです。

ORA-65024: プラガブル・データベースSTATISTICSはオープンしていません。
SP2-0382: SHOW PDBSコマンドは使用できません。

プラガブルデータベースのオープンと、SHOW PDBSコマンドの実行はロールの指定が悪かったようです。

上記のようにロールをDBAなどにしてやる必要があります。つまり、操作可能なロールを指定しないと動かせないということです。

PDB(プラガブルデータベース)を開く

DBにSYSTEMなどのユーザーでアクセスしたときには、CDBという管理ようのDBにアクセスします。
ここに自前のテーブルなどを作るのは、セキュリティ的によくないのでPDBを作成します。

<SqlDeveloperで実行するとき>

  1. アクセスするときに、DBAのロールを付けたユーザーでログイン。
  2. SQLワークシートを開く(ツール→SQLワークシート)

PDBが見れない状態

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO        
         3 XEPDB1                         READ WRITE NO        
         4 NEW_PDB                        MOUNTED              
         5 STATISTICS                     MOUNTED              
         6 SAMPPLE                        MOUNTED    

PDBが見れる状態

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO        
         3 XEPDB1                         READ WRITE NO        
         4 NEW_PDB                        READ WRITE NO        
         5 STATISTICS                     READ WRITE NO        
         6 SAMPPLE                        READ WRITE NO    

おわりに。。。

色々やってきたけど、データベースをインストールしたときに一緒にインストールした「Database Configuration Asistant」でDBのセットアップができるようです。

そのほかのエラー

操作をしていて、いろいろなエラーが出ています。忘れないように追記していきます。

でわでわ。。。

Mavenをちゃんと学習する

Apache Mavenを学習

Apache MavenはPOMファイルを使用して、依存関係を簡単に追加できます。

まずはインストール

必要なものとしては、JDK(Javaを動かす&開発するため)とMaven本体です。

JDKインストール

このリンクからOpenJDK17のインストーラーがダウンロードできます。ダブルクリックでインストールできます。

Mavenのインストール

参照したサイトは本家のサイトです。
同様にMavenのリンクです。「apache-maven-3.9.6-bin.zip」がダウンロードできます。

環境変数を設定する

JDKに関しては、インストーラーを使用したので、全てインストーラーがやってくれますが。。。
Mavenに関しては手動でインストールするので次の操作が必要になります。

  1. 環境変数の設定
  2. コマンドの実行確認

1. 環境変数の設定

ダウンロードしたファイル(apache-maven-3.9.3)を、とりあえずドキュメント直下、つまりユーザーの直下に配置します。
具体的には、Takunojiユーザーの場合はC:\Users\Takunojiの下に配置します。下のようなパスになります。

C:\Users\Takunoji\apache-maven-3.9.3

そして、エクスプローラでそこからbinフォルダを開きますと下のような画面が見れます。MVNコマンドが入っています。

「bin」と書いてある部分をクリックすると「パス」が表示されるのでこれをコピーしておきます。

次に、Windowsボタンを押下

「環境変数」と入力して下のようなものを表示し、クリックします。

下のような画面が見れますので、「Path」の部分を選択して下の「編集」ボタンをクリックします。

すると、パスを入力できる場所がありますのでそこにMavenのパス+「bin」を記述します。

C:\Users\Takunoji\apache-maven-3.9.3\bin

これでOKしてからコマンドを開き

mvn -version

とコマンドを入力します。下のように表示できればOK!
※下の例はDドライブにインストールしたものなのでパスがD:¥XXXXとなっています。

単純に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のライブラリが読み込めない

Installコマンドでエラー

下のようにコマンドを入力してえらーになるケースです。

mvn install

ソースオプション

[ERROR] Source option 1.5 is no longer supported. Use 1.6 or later.
[ERROR] Target option 1.5 is no longer supported. Use 1.6 or later.

上のようなメッセージが出力さおうれます。
これは、pomファイルに以下のコードを追加します。「propertiesタグ」の中に追加します。

    <maven.compiler.source>1.6</maven.compiler.source>
    <maven.compiler.target>1.6</maven.compiler.target>

しかし、このままだと下のようなエラーメッセージが出力されます。

diamond operator is not supported in -source 6

これは、上記の値部分を「1.8」以上に設定すれば解消されます。

    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>

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; */
}