2017-06-20 61 views
2

私はNetbeans 8.2を使ってSpringアプリケーションを開発しています。私が問題を抱えているこの特定のアプリはSpring Boot 1.5.3アプリです。私はバネXMLファイルと、ルートプロジェクトディレクトリの/ configに保存するapplication.propertiesを持っています。Springブートはコマンドライン実行からクラスパスにファイルを追加します

@ImportResource注釈と@ImportResource(value="${config.xmlfile}")のような値プロパティを使用して、spring xmlファイルをプロジェクトに渡します。

Netbeansの[プロジェクトの実行]ボタンをクリックすると、Springアプリケーションが起動し、application.propertiesファイルがmy/configフォルダに正しく検索されます。ただし、そのフォルダ内の他のファイルへのクラスパス参照は失われます。たとえば、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 

私は次のようにjarファイルを作るためにspring-boot-maven-pluginを使用しています:

<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 repres私はJavaがインストールされている場所を指定します。 -cpで設定されたクラスパスはここでは動作していないようです。 IDEを実行する場合と同様に、config.xmlファイルをclasspath:config/file.xmlまたはclasspath:file.xmlに設定すると、ファイルは見つかりませんが、file:../config/file.xmlが機能します。

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

誰にでもアイデアやヒントがありますか?前もって感謝します!

答えて

4

、と私は、次の作業を取得することができたTuyenNguyenの役に立つ答え@に感謝:私は、コマンドラインから実行したときにそのよう

は、私は私の春・ブートのmaven-pluginのに以下を追加しましたそれは、代わりにJarLauncherPropertiesLauncherを使用しています。

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

PropertiesLauncherオプションの詳細のためにherehereを参照してください。クラスパスを設定することができます。 here,およびhereを参照して、この問題の解決策を見つけました。フォーマットZIPを使用すると、PropertiesLauncherが使用されます。私が意図したとおりに

はそこから、私は、アプリケーションを起動するには、このコマンドを使用することができました:

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

もう一つの重要な注意事項:-Dloader.pathを指定する場合、カンマ区切り値およびディレクトリとファイルのみを使用してください(here)。また、-jar jarを指定する前に-D argsを指定することをお勧めします。

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

+1

詳細なメモをありがとう。コマンドの-Dloader.pathの場所を変更した後で動作します。 – Silentbang

+1

@Silentbangこの回答がうまくいけば、私は物事を把握するのに少し時間がかかりました。 Springからのこのトピックのドキュメントはうまくいきましたが、 '-Dloader.path'に渡すときにパスを指定する方法のように、いくつかの場所で規約が破られました – wrslatz

1

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

もう1つの解決策は、フォルダを作成し、編集したくないファイルをすべてパッケージに入れてから実行するたびに手動でそのフォルダにクラスパスを設定することですが、上記の設定方法が正しくない場合は、thisクラスパスを正しい方法で設定します。いくつか調査した

+0

あなたが提供した2番目のオプションは、適切なソリューションのようです。しかし、これは再パッケージされたSpring Bootアプリケーションであるため、Jarの内部クラスに簡単にアクセスすることはできません。 main()のクラスは再パッケージ化されているので、2番目の例のようにアクセスできません。私は、[PropertiesLauncher]を[ここ](https://docs.spring.io/spring-boot/docs/current/reference/html/executable-jar.html#executable)として使用することができるかどうか見てみるつもりです。 -jar-property-launcher-features) – wrslatz

関連する問題