web-dev-qa-db-ja.com

Maven WARの依存関係-パッケージを解決できませんか?

私は戦争に依存しています:

    <dependency>
        <groupId>my.package</groupId>
        <artifactId>myservices</artifactId>
        <version>0.3</version>
        <type>war</type>
    </dependency>

現在、これは私のローカルリポジトリに存在し、クラスはWEB-INF/classes/my/package/myservicesに存在します。しかし、myservicesを使用しようとすると、パッケージmy.packageが存在しません。 Intelli-Jはmyservicesmy.package.myservicesに変更することを知っていますが、importを試みてもまったく機能しないようです。

この戦争依存関係で私がしなければならない特別なことはありますか?

17
Stefan Kendall

それはそのようには機能しません。 WARファイルはクラスパスに配置されることは想定されていませんが、特別な構造を処理できるアプリケーションサーバー(またはサーブレットコンテナ)にデプロイされます。

もちろん、Java warファイルを処理できるカスタムクラスローダーはどこかにあるでしょうが、それはそれを行う方法ではありません。

コードをjarに保存し、jarを戦争とこのアプリケーションに含めます。ただし、EARファイルを作成する場合を除いて、依存関係としてwarを使用しないでください。

33

他の回答で指摘されているように:

  • Mavenでは、JARアーティファクトからのようにWARアーティファクトからクラスをロードすることはできません。
  • したがって、再利用するクラスで別のMaven JARプロジェクトを分割し、元のWARと新しいプロジェクトの両方でこのプロジェクトに依存することをお勧めします。

ただし、何らかの理由でWARプロジェクトを分割できない、または分割したくない場合は、WARに加えてJARアーティファクトが必要であることをMavenに通知することもできます。これをWARプロジェクトのPOMに入れます。

<build>
    ...
    <plugins>
      ...
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.3</version>
        <configuration>
          <attachClasses>true</attachClasses>
        </configuration>
      </plugin>
    </plugins>
  </build>

次に、WARプロジェクトをビルドするときに、MavenはそこからWARおよびJARを作成します。

出典: Maven WarプラグインFAQ

doc_180のコメントから採用されているため、見落とされません。

30
sleske

WARの依存関係は、MavenによってJARの依存関係とは非常に異なる方法で処理されます。それらはオーバーレイとして扱われます。

http://maven.Apache.org/plugins/maven-war-plugin/overlays.html

あなたが探しているのは、WARオーバーレイとは少し違うものだと思います。 WARオーバーレイは、ファイル構造を「最も近い勝利」モデルとマージしますが、これは、web.xmlのようなものが、マージされずに最も近い勝利に置き換えられることを意味します。

マージが必要な場合(これは、ほとんどの人がWARの依存関係について話し始めたときに考えるものに近い)、Cargouberwarプラグインを確認する必要があります。

http://cargo.codehaus.org/Merging+WAR+files

単に2つのWAR間でいくつかのクラスを共有することが目標である場合は、おそらくそれらのクラスをJARプロジェクトに配置する必要があります。特にMavenは、pom.xml->単一のアーティファクトモデル(JAR/WAR/etc)で動作するように実際に設計されています。単一のpom.xmlを取得して、たとえば、あるものにはJARを、他のものにはWARを出力させようとすると、非常に苦痛になります。

ちなみに、1人以上のチームで作業している場合は、アーティファクト管理サーバー(Artifactory、Nexus、Archivaなど)をかなり高速に処理する必要があります。そうしないと、このような処理に夢中になります。 ;)

3
Will Iverson

WARでは、クラスはWEB-INF/classes/...ではなくclasses/...に配置する必要があります。

とにかく、私はWAR(JARではない)から他のクラスを参照しようとしたことがなく、これが可能かどうかはわかりません。

2
Ralph

依存関係がローカルリポジトリにインストールされていることを確認してください。
ローカルリポジトリは次のようになります。

.m2/my/package/myservices/0.3/myservices-0.3.war

そうでない場合は、依存関係で使用する前に、warをローカルリポジトリにインストールしてください。

mvn install:install-file -Dfile="[path-to-war]"  -DgroupId=my.package  -DartifactId=myservices -Dversion=0.3 -Dpackaging=war -DcreateChecksum=true -DgeneratePom=true
0
Arpit