質問: ### 前提・実現したいこと jpg内のバーコードをよみとるため、Zxingのライブラリを使用しようとしています。 ネット上でPHPZxingという、Zxingライブラリを使用してバーコードを作成して読み取るPHPラッパーをみつけたので、これを使用してPHPで読み取りバッチを作成しようと思っています。 その処理の中で core-3.3.3.jarとjavase-3.3.3.jarをコマンドで叩く箇所でエラーがおきています。 なぜエラーが出るのかわからず困っています。 ### 発生している問題・エラーメッセージ エラー箇所のコマンドをそのまま抜き出して コマンドプロンプトから直接打ってみたら以下のエラーが出ました。 「URIは階層的ではありません」的な事を言っているようですが・・・ ``` Exception in thread "main" java.lang.IllegalArgumentException: URI is not hierarchical at java.base/sun.nio.fs.WindowsUriSupport.fromUri(WindowsUriSupport.java:122) at java.base/sun.nio.fs.WindowsFileSystemProvider.getPath(WindowsFileSystemProvider.java:93) at java.base/java.nio.file.Path.of(Path.java:203) at java.base/java.nio.file.Paths.get(Paths.java:97) at com.google.zxing.client.j2se.CommandLineRunner.expand(CommandLineRunner.java:112) at com.google.zxing.client.j2se.CommandLineRunner.main(CommandLineRunner.java:76) ``` ### 該当のソースコード 以下のコマンドをたたきました (PHPZxing内で自動で生成されるコマンド) Code128Barcode.jpg(バーコードの入ってるjpg)をCommandLineRunnerを使ってjavase-3.3.3.jar等のライブラリでなんやらかんやら してるようですが、javaも詳しくないしコマンドも詳しくないので理解できずにいます。 ``` java -cp C:\xampp\htdocs\localhost\vendor\php-zxing-master\src\bin\javase-3.3.3.jar;C:\xampp\htdocs\localhost\vendor\php-zxing-master\src\bin\core-3.3.3.jar;C:\xampp\htdocs\localhost\vendor\php-zxing-master\src\bin\jcommander-1.72.jar com.google.zxing.client.j2se.CommandLineRunner C:\xampp\htdocs\localhost\vendor\php-zxing-master\src\images\Code128Barcode.jpg ``` ### 試したこと javaの環境変数や実行環境などは通しているはずです。 com.google.zxing.client.j2se.CommandLineRunner というのは 。 追記です。 jarファイルの前にjar:file:と付け足してみました・・。 メイン・クラスcom.google.zxing.client.j2se.CommandLineRunnerを検出およびロードできませんでした とエラー内容が変わりました。 java -cp jar:file:C:\xampp\htdocs\localhost\vendor\php-zxing-master\src\bin\javase-3.3.3.jar;jar:file:C:\xampp\htdocs\localhost\vendor\php-zxing-master\src\bin\core-3.3.3.jar;jar:file:C:\xampp\htdocs\localhost\vendor\php-zxing-master\src\bin\jcommander-1.72.jar com.google.zxing.client.j2se.CommandLineRunner C:\xampp\htdocs\localhost\vendor\php-zxing-master\src\images\Code128Barcode.jpg エラー: メイン・クラスcom.google.zxing.client.j2se.CommandLineRunnerを検出およびロードできませんでした 原因: java.lang.ClassNotFoundException: com.google.zxing.client.j2se.CommandLineRunner
回答: 「試したこと」に記載の対応について、mainクラスがロードできていないので問題外です。 「発生している問題・エラーメッセージ」に記載の事象が発生しているのは、javaの実行が正しく行えているからこそ出ています。 なので、この場合は「発生している問題・エラーメッセージ」の理由を考え、それに対して対応することが課題解決となると思います。 発生しているエラーを読み解きましょう。 「java.lang.IllegalArgumentException: URI is not hierarchical」これがエラーが発生している箇所が出力しているエラーメッセージです。 発生している箇所は、その直後のat以降に記載されています。 この場合、「java.base/sun.nio.fs.WindowsUriSupport」クラスの「122」行目の「fromUri」メソッド中でエラーが発生していることが分かります。 実際のコードはGithubにコードがありますので、読めるのであれば参照してみて下さい。 コードはこちら 121行目で「if (uri.isOpaque())」という判定処理をしています。コード中「uri」は「URI」クラスのインスタンスで「isOpaque」というメソッドは「URIインスタンス生成時に与えられた値が不透明かどうか」を判定します。 日本語は不明ですが、このケースでいくとjava起動時のjpgファイルのパスが「不透明かどうか」を判定しています。「不透明かどうか」の判定は、平たく言うと、URIのスキーマ(このケースではスキーマは「C」)の直後の「:」のあとに「/」がついていないか、の判定になる、らしいです。(この解釈でいいかは自分も不明確です。。。) 細かく言ってきましたが、ようは「引数のjpgファイルのパスがWindowsの形式として間違っている」ためのエラーみたいです。 そこで、対応案をいくつか挙げてみます。 * jpgファイルの指定をダブルクォーテーションで囲う * jpgファイルの指定のバックスラッシュ(\)の部分をバックスラッシュ2つ(\\ )にする * jpgファイルの指定をダブルクォーテーションで囲いバックスラッシュ(\)の部分をバックスラッシュ2つ(\\ )にする 上記をやってみてエラーとなるなら、ちょっとお手上げです。