web-dev-qa-db-ja.com

Spring Bootは、コマンドライン実行からクラスパスにファイルを追加します

私はNetbeans8.2を使用してSpringアプリケーションを開発しています。私が問題を抱えているこの特定のアプリは、Spring Boot1.5.3アプリです。ルートプロジェクトディレクトリの下の/ configに保持しているspringxmlファイルとapplication.propertiesがあります。

_@ImportResource_アノテーションと@ImportResource(value="${config.xmlfile}")のようなvalueプロパティを介してspringxmlファイルをプロジェクトに渡します。

Netbeansの「プロジェクトの実行」ボタンをクリックすると、Springアプリが起動し、/ configフォルダにあるapplication.propertiesファイルが正しく検出されます。ただし、そのフォルダー内の他のファイルへのクラスパス参照はすべて失われます。たとえば、config.xmlファイルを_classpath:config/file.xml_または_classpath:file.xml_に設定すると、どちらもファイルを見つけることができませんが、_file:config/file.xml_は機能します。

同様に、コマンドラインから実行する場合、構造として次のものがあります。

_app/
|-- bin
|   `-- app-run.sh
|-- config
|   |-- application.properties
|   |-- log4j2.xml
|   |-- file.xml
`-- app-exec.jar
_

私は_spring-boot-maven-plugin_を使用して次のようにjarを作成しています:

_<plugin>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-maven-plugin</artifactId>
     <version>${spring.boot.version}</version>
     <executions>
          <execution>
               <goals>
                    <goal>repackage</goal>
               </goals>
               <configuration>
                    <classifier>exec</classifier>
               </configuration>
          </execution>
     </executions>
</plugin>
_

そして私のapp-run.shスクリプトは以下を実行します:

_exec /bin/Java -cp :.:../config/*:../app-exec.jar 
-Dlogging.config=../config/log4j2.xml 
-Dspring.config.location=../config/application.properties 
-jar ../app-exec.jar
_

ここで、/ bin/Javaは、Javaがインストールされている場所を表します。-cpで設定されたクラスパスはここでは機能していないようです。IDEを実行する場合と同様に、config.xmlを設定します。 file to classpath:config/file.xmlまたはclasspath:file.xmlはどちらもファイルを見つけることができませんが、file:../ config /file.xmlは機能します。

IDEとコマンドラインの両方でクラスパスを設定して、クラスパス参照を使用してSpringのファイルにアクセスできるようにしたいのですが、入れたくありません。これらはすべて_src/main/resources_にあり、パッケージ化してデプロイした後に編集する必要があるため、jarにパッケージ化してください。

誰かアイデアや役立つヒントはありますか?前もって感謝します!

5
wrslatz

更新された回答:

私の元の回答の慣例に従うことができますが、最近、より標準的な、よりシンプルでクリーンなオプション(「Java」の方法)のためにこれを削除しました。コンパイル時に(正確なバージョンでは)使用できなかった依存ライブラリを実行時に動的にロードする必要があるため、変更を加えました。私たちの場合、依存するjarを個別のフォルダーからのみロードし、実行可能なjarからはロードしたくありませんでした。実行可能jarと個別のフォルダーに重複する依存関係があることになったため、実行可能jarのプロパティランチャーを削除し、代わりに個別のフォルダーからのみ依存関係をロードすることにしました。これは多くの場合[〜#〜]ではない[〜#〜]最良のオプションであり、ユースケースに合わせて評価する必要があります。私は標準のJavaクラスパスを読むことを好みます。

実行可能jarなしでSpringBootアプリを実行するために、Mavenアセンブリを使用して依存jarを/ libsディレクトリに配置し、spring-boot-maven-pluginを削除しました。このための手順といくつかのコードは以下のとおりです。

  1. 実行可能jarをZip形式で作成するspring-boot-maven-pluginを削除します
  2. アセンブリXMLに以下を追加します

    <dependencySets> <dependencySet> <outputDirectory>where you want the libs to go</outputDirectory> <useProjectArtifact>whether you want to include the project artifact here</useProjectArtifact> </dependencySet> </dependencySets>

  3. メインクラスからコードを実行し、クラスパスに依存するjarフォルダーを含めます。カスタムの扱いにくいPropertiesLauncherローダーパス構文ではなく、OSで標準のクラスパス表記を使用します

    Java -cp <standard-classpath> <main-class>

実際の呼び出しの例:Java -cp $CLASSPATH:./lib/*:./cfg/*:my-app.jar Application.class

このようにして、標準のJava実行呼び出し、カスタムのSpringロード構文なしでSpringBootアプリを実行します。実行時にすべての依存関係がクラスパスで利用可能であることを確認する必要があります。これにより、メンテナンスがはるかに簡単になり、すべてのアプリの標準になりました。

元の答え:

いくつか調査した後、@ TuyenNguyenの有益な回答のおかげで、次のことが機能するようになりました。

以下をspring-boot-maven-pluginに追加して、コマンドラインから実行したときにPropertiesLauncherの代わりにJarLauncherを使用するようにしました。

<configuration>
     <mainClass>${mainClass}</mainClass>
     <layout>Zip</layout> //THIS IS THE IMPORTANT PART
</configuration>

PropertiesLauncherオプションの詳細については、 ここ および ここ を参照してください。これにより、特にクラスパスを設定できます。この問題の答えを見つけた場所については、 ここここ 、および ここ を参照してください。フォーマットZipを使用すると、PropertiesLauncherが使用されます。

そこから、このコマンドを使用して、意図したとおりにアプリケーションを起動できました。

Java -Dloader.path=../config,../ -Dloader.config.location=classpath:application.properties -jar ../app-exec.jar

もう1つの重要な注意事項:-Dloader.pathを指定するときは、 ここ で説明されているように、必ずコンマ区切りの値を使用し、ディレクトリとファイルのみを使用してください。また、-jar jarを指定する前に、必ず-D引数を入力してください。そうしないと、設定されません。

追加のユーザーを支援するために、この回答または元の質問をさらに改善するための提案や編集がある場合は、私に知らせてください。または自分で編集してください。

7
wrslatz

ファイルをsrc/main/resourcesに配置しない場合は、任意のフォルダー内に配置できますが、フォルダーをリソースフォルダーとして設定する必要があります。 classpathは常にresourcesフォルダーを指しているためです。フォルダをリソースフォルダとして作成すると、jarにパッケージ化されます。リソースファイルを編集する場合は、 7 Zip tool を使用してjarを開く->ファイルを編集する->保存する-> jar内の変更を更新します。

別の解決策は、フォルダーを作成し、編集するすべてのファイルをその中にパッケージ化せずに配置し、実行するたびにクラスパスをそのフォルダーに手動で設定することですが、上記の設定方法が正しくない場合は、 this =クラスパスを正しい方法で設定するためのソリューション。

1
TuyenNTA