見出し画像

【Java・Maven】war/jar内のMANIFEST.MFにクラスパスが出力されない時の対処法


■現象

Sample.warがあるとする。
これを実行したときに必要なclasspathが含まれておらず「xxxx class is not found」というようなエラーが発生する。

■原因

warに含めるMANIFEST.MFファイルにて、Class-Pathが空になっている。

具体例

  1. warを分解する
    warがあるディレクトリでコマンドプロンプトを起動し、以下のコマンドを打ち、warを分解してみる。
    ⇒jar xvf Sample.war

  2. 展開されたMANIFEST.MFを見る
    分解後の構成例)
    root
    ├Sample.war
    ├META-INF
    │ ├maven
    │ └MANIFEST.MF・・・このファイルを開く
    ├WEB-INF
    ├ :

  3. MANIFEST.MFがこうなっていたらダメ
    Manifest-Version: 1.0
    Build-Jdk-Spec: 1.8
    Created-By: Maven Archiver 3.4.0

正しいMANIFEST.MFの中身は、以下のようにクラスパスが含まれる形となる。

Manifest-Version: 1.0
Class-Path:  xxxx.jar common.jar jackson-core-2.7.4.jar xstream-1.4.4.jar
  xmlpull-1.1.3.1.jar commons-io-2.4.jar commons-net-3.1.jar

 :
 :
Build-Jdk-Spec: 1.8
Created-By: Maven Archiver 3.4.0

しかし何らかの影響でクラスパスが含まれない状態で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に記載したとしても、私の環境では問題なくクラスパスが出力された。
→環境に依るところもあるので、適宜お持ちの環境に合わせること。

■参考文献


いいなと思ったら応援しよう!