1

私はMavenを使用して、Tomcatで実行されるJavaWebアプリケーションを構築しています。特定のJARファイル(mail-1.4.1.jarやデータベースドライバーなど)がtomcat / libディレクトリに配置され、mavenの依存関係が「提供」に設定されています。(理由は100%わかりませんが、JNDIと関係があると思います。)

これで、を使用して実行しようとしているのと同じMavenプロジェクトにスタンドアロンの実行可能Javaプログラムを構築しましたmvn exec:java。当然のことながら、mail.jarが見つからず、エラーが発生しますjava.lang.NoClassDefFoundError: javax/mail/Session

Tomcatアプリに「提供」されている間に、スタンドアロンJavaプログラムにjavax.mail scope = "runtime"を指定するにはどうすればよいですか?Mavenプロファイルを使用する必要がありますか?もしそうなら、これがどのように機能するかについての有用なドキュメントをどこで見つけることができますか(プロファイルの依存関係は追加的ですか、それともデフォルトのものを上書きしますか?)

4

3 に答える 3

2

プロファイルの概要を読むことができます。

プロファイルで宣言された依存関係のスコープは、プロファイルがアクティブなときにデフォルトのスコープをオーバーライドします。したがって<runtime>、プロファイル内で関連するjarのスコープを指定し、それをスタンドアブルアプリで使用できるようにする必要があります。

于 2012-06-06T12:10:05.843 に答える
2

Raghuramの答えは正しいですが、私は何かを指摘したいと思います。

Sonatypeがブログに書いたように:http://www.sonatype.com/people/2010/01/how-to-create-two-jars-from-one-project-and-why-you-shouldnt/

私はこの答えについて非常に明確にしたいと思います。1つのプロジェクトから2つの別々のJARを作成するようにMavenプロジェクトを構成しないことを強くお勧めします。これは、Mavenの最も重要なコアコンセプトの1つであるモジュール性に違反しています。

あなたがしていることは「TheMavenWay」にはないようです。あなたがそのような問題で立ち往生し始めたとき、あなたはこれがあなたが選んだ正しい解決策ではないかもしれないと常に考えるべきです。

この種の問題については、1つのpomで複数のアーティファクトを処理することに関して多くのトピックがあります。

単一のMavenプロジェクトからの複数のアーティファクトの処理

Maven:複数のアーティファクトをアタッチする

..。

そして、Raghuramが提案したように、複数の環境プロファイルをどのように処理するかについての良いものがあります: CI / Hudsonサポートを使用して複数の環境[prod、test、dev]のアーティファクトを生成するためのMavenのベストプラクティス?

ですから、プロジェクトを分割して、それらの間の実際の実現について考えてみることをお勧めします。それはおそらくあなたを次のようなマルチモジュールプロジェクトに駆り立てるかもしれません

parent
|
+--project:jar
|
+--web-app:war

..。

ここを見てください:http://www.sonatype.com/books/mvnex-book/reference/multimodule.html

幸運を :)

于 2012-06-06T12:29:15.703 に答える
0

はい、Raghuramが示唆しているように、異なるスコープで依存関係を持つプロファイルを作成することは機能します。

<profiles>
    <profile>
        <id>standalone</id>
        <dependencies>
            <dependency>
                <groupId>javax.mail</groupId>
                <artifactId>mail</artifactId>
                <version>1.4.1</version>
                <scope>runtime</scope>
            </dependency>
        </dependencies>
    </profile>
</profiles>

他の場所では、Webアプリの必要に応じて、提供されたスコープでアーティファクトが宣言されます。

以下を使用して実行します。

mvn exec:java -Dexec.mainClass = XXX -Pstandalone

しかし、プロファイルを使用することが正しい答えであるとは確信していません。

于 2012-06-06T12:18:58.833 に答える