ソフラボの技術ブログ

仕事で使ったプログラミング、サーバー周りで役に立つこと、Webサービス開発に必要な技術情報、モバイル情報を書いてます。わかりやすく見やすくをモットーにしています。

WildFlyにJerseyアプリをデプロイするとエラーが発生するときの対処方法

WildFlyにSpring Bootで作成したJerseyを含むWebアプリをデプロイしようとすると、エラーが発生しデプロイができない現象に遭遇しました。
その時の対処方法をまとめました。

環境

CentOS 6
WildFly 11
Spring Boot 2.0.4
Jersey 2.26

原因

デプロイできない原因は、WildFly側にJAX-RSのライブラリがあり競合するためです。

対処方法

Webアプリ側にjboss-deployment-structure.xmlを用意し以下のように定義する。

jboss-deployment-structure.xml

<?xml version="1.0"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <deployment>
        <exclude-subsystems>
            <subsystem name="jaxrs" /> <!-- 追記する -->
        </exclude-subsystems>
    </deployment>
</jboss-deployment-structure>

jboss-deployment-structure.xmlをwarに含める場合、WEB-INF配下に置くようにします。

Gradleで以下のように定義しwarビルドすると、自動的にWEB-INF配下にコピーされます。

war {
    from('src') {
        include 'jboss-deployment-structure.xml'
        into 'WEB-INF'
    }
}

開発環境では、xmlファイルをsrcディレクトリ直下に置いておきます。

注意事項

すでにデプロイできない事象に遭遇している場合、上記対応を行ってもデプロイ時にエラーが発生します。
エラーなのにデプロイ時のゴミは残ったままなので、それらを削除する必要があります。

standalone.xmlを修正する

ファイルの場所:wildfly-root/standalone/configuration/standalone.xml

タグがある所を探し(ファイルの最後あたり)、デプロイに失敗したアプリ名の箇所を削除します。

<deployments>
    <deployment name="postgresql-9.4.1212.jar" runtime-name="postgresql-9.4.1212.jar">
        <content sha1="38931d70811d9bfcecf9c06f7222973c038a12de"/>
    </deployment>

    <!-- 対象のアプリ名部分を削除する -->
    <deployment name="Test.war" runtime-name="Test.war">
        <content sha1="fcb6ff1bf0777ce6b276f5067903db03c1addc3d"/>
    </deployment>
    <!-- ここまで -->
</deployments>

関連ファイルを削除する

WildFlyインストールディレクトリからfindコマンドで対象のアプリ名で検索をかけます。
それでヒットしたファイル、ディレクトリを削除します。
忘れましたが、warファイルとそれらを展開したクラスファイル等があるディレクトリを削除すれば良いです。