【Java・Maven】war/jar内のMANIFEST.MFにクラスパスが出力されない時の対処法
■現象
Sample.warがあるとする。
これを実行したときに必要なclasspathが含まれておらず「xxxx class is not found」というようなエラーが発生する。
■原因
warに含めるMANIFEST.MFファイルにて、Class-Pathが空になっている。
具体例
warを分解する
warがあるディレクトリでコマンドプロンプトを起動し、以下のコマンドを打ち、warを分解してみる。
⇒jar xvf Sample.war展開されたMANIFEST.MFを見る
分解後の構成例)
root
├Sample.war
├META-INF
│ ├maven
│ └MANIFEST.MF・・・このファイルを開く
├WEB-INF
├ :MANIFEST.MFがこうなっていたらダメ
Manifest-Version: 1.0
Build-Jdk-Spec: 1.8
Created-By: Maven Archiver 3.4.0
正しいMANIFEST.MFの中身は、以下のようにクラスパスが含まれる形となる。
しかし何らかの影響でクラスパスが含まれない状態でMANIFEST.MFが出力されてしまうことが原因である。
■解決
mavenのpom.xml内に、クラスパス出力命令コマンドを加筆してあげるだけでよい。
記入箇所
例)
workspace
├project-folder1
├project-folder2
├project-folder3
├project-folder4
:
├project-web-backend
├project-web-frontend
├pom.xml・・・ここに以下コードを入れる。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="https://-----"
xsi:schemaLocation="http://-----">
<properties>
...
</properties>
<dependencies>
...
</dependencies>
<packaging>war</packaging>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configration>
<target>${java.version}</target>
<source>${java.version}</source>
</configration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
<configration>
<warSourceDirectory>FrontendContents</warSourceDirectory>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configration>
</plugin>
</plugins>
</build>
</project>
大事なところは、「<addClasspath>true</addClasspath>」の部分。
これを入れていれば、MANIFEST.MF内にクラスパスが出力されるようになる。
補足
今回は、Web公開プロジェクトである「project-web-frontend」のpom.xmlに記載したが、サーバ側処理プロジェクトである「project-web-backend」のpom.xmlに記載したとしても、私の環境では問題なくクラスパスが出力された。
→環境に依るところもあるので、適宜お持ちの環境に合わせること。