1. 無料アクセス解析

crossroad's Blog

Javaを中心にした技術ネタなど。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

Maven3.xで、スナップショットでデプロイすると、ファイル名に必ずタイムスタンプが付く

Maven3.xからは、pom.xml の distributionManagement の uniqueVersion の指定が無効になっているらしい。
Maven3.xでの変更点 にも明記されている)

たとえば、以下のような pom.xml を書いて、mvn deploy でスナップショットをデプロイすると...


<project>
<artifactId>example</artifactId>
<version>1.0-SNAPSHOT</version>
<distributionManagement>
<repository>
<uniqueVersion>false</uniqueVersion>
<id>my.repo</id>
<name>My release repository</name>
<url>....</url>
</repository>
<snapshotRepository>
<uniqueVersion>false</uniqueVersion>
<id>my.repo</id>
<name>My snapshot repository</name>
<url>....</url>
</snapshotRepository>
</distributionManagement>
</project>



リモートリポジトリ上にデプロイされるアーティファクトは、 example-1.0-20111210.123456-1.jar のようにファイル名にタイムスタンプが自動的に付与される。
そのため、同じスナップショットのデプロイを繰り返すと、リモートリポジトリ上にタイムスタンプ違いのファイルがどんどん作られていく。
(なお、アーティファクトのダウンロード時は、最新のファイルが example-1.0-SNAPSHOT.jar としてダウンロードされる)

これを防ぎたい場合、 uniqueVersion=false を指定すれば example-1.0-SNAPSHOT.jar のようなファイル名でデプロイされる(デプロイを繰り返しても、同じファイル名で上書きされる)はずだが、Maven3.xからは必ず前述のようにタイムスタンプが付いたファイル名になってしまう。


どうやら、

 ファイル名にタイムスタンプが付かないようにするのは、それによってディスクスペースが消費されるのを防ぎたい場合だが、
 本来は過去のスナップショットも残しておくべきで、ディスク消費に対しては別途古いスナップショットを消すなりするべきだ。

と言うことらしい。


スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2011/12/10(土) 22:22:46|
  2. ソフトウェア開発 Maven
  3. | トラックバック:0
  4. | コメント:0

Maven3.x では、Maven1.x形式のリポジトリを扱えない

Maven1.x と Maven2.x 以降は、リポジトリのレイアウトが異なっているが、
Maven2.x では pom.xml で旧リポジトリレイアウトであることを指定(layout=legacy)することで、Maven1.x のリポジトリを参照できていた。


<repository>
<id>...</id>
<name>...</name>
<url>http://.../.../maven</url>
<旧リポジトリレイアウトであることを指定>
<layout>legacy</layout>
</repository>


Maven3.x からは、layout=legacy がサポートされなくなって Maven1.x 形式のリポジトリを参照できなくなっているらしい。
Maven 3.x Compatibility Notes

OSSライブラリの中には、まだ Maven1.x 形式のリポジトリのままになっているものもあるので、これはちょっと困るな...

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2011/11/16(水) 23:41:34|
  2. ソフトウェア開発 Maven
  3. | トラックバック:0
  4. | コメント:1

Maven2のjavadoc生成でコンパイルエラー

Maven2 でJavaDocを生成(mvn javadoc:javadoc)すると、
コンパイルエラーが発生しました。


例えば、JUnitのTestCaseを継承して、独自のTestCaseを作成し、JavaDocを生成しようとすると。。。


-----------------------------------------
> mvn javadoc:javadoc
  :
パッケージ foo.bar.test のソースファイルを読み込んでいます...
Javadoc 情報を構築しています...
標準 Doclet バージョン 1.5.0_11
全パッケージとクラスの階層ツリーを作成しています...
警告 3 個
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------

C:¥eclipse¥workspace¥foo¥src¥main
¥java¥foo¥bar¥test¥FooTestCase.javaa:23: シンボルを見つけられません。
シンボル: クラス TestCase
public abstract class FooTestCase extends TestCase {
                     ^

java.lang.NullPointerException
at com.sun.tools.javadoc.TypeMaker.getType(TypeMaker.java:65)
-----------------------------------------



JavaDoc生成以外では、Maven2からでも、Eclipse上でもコンパイルが通っているのに、
なぜかJavaDoc生成時にJUnitのTestCaseクラスが見つからず、コンパイルエラーになってしまいます。


原因は、pom.xmlの依存関係のスコープで、
--- pom.xml(抜粋) ---
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
-------------------
のようにJUnitライブラリを追加していたことでした。

JUnitなので、テスト時にしか使わないだろうと言うことでスコープをtestにしていました。
# testスコープのライブラリは、ユニットテストのコンパイルと実行にしか使用されません。(参考

ところが、JUnitを拡張して作成したクラスFooTestCaseは、
¥src¥test¥java下ではなく、¥src¥main¥java下に配置
していた...
つまり、ユニットテストではないので、testスコープの範囲外と言うことで、
JavaDoc生成時にJUnitライブラリがクラスパスに設定されないようです。


対応としては、pom.xmlで、JUnitのスコープを修正すれば良いのですが、
compileスコープにしてしまうと、実行モジュールにJUnitがバンドルされてしまう
(*.warの/WEB-INF/libに入ってしまう等)ので、

--- pom.xml(抜粋) ---
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>provided</scope>
</dependency>
-------------------
のように、providedにしました。

これならコンパイルも通るようになるし、実行モジュールにJUnitが入ってしまうこともありません。




  1. 2007/10/22(月) 23:11:59|
  2. ソフトウェア開発 Maven
  3. | トラックバック:0
  4. | コメント:0

(続)Maven2のブラックリストに載ってしまったリポジトリを復活させるには

以前の記事「Maven2のブラックリストに載ってしまったリポジトリを復活させるには」で、
Maven2のブラックリストについて書きましたが、その後、色々とわかりました。

1.ブラックリストは、アーティファクト単位に管理される
 当初、ブラックリストはリポジトリ単位で管理されている...例えば、
  ・centralリポジトリ はOK
  ・mirrorリポジトリ はブラックリスト(注:mirrorリポジトリと言うのは単なる例で実在しません)
 のように...と思っていたのですが、そうではなく、
 アーティファクト単位で管理されているようです。

 つまり、
  ・アーティファクトmaven-surefire-pluginは、centralリポジトリからダウンロードOK
  ・アーティファクトmaven-surefire-pluginは、mirrorリポジトリからダウンロードNG(ブラックリスト)
 のような感じになっているようです。

2.ブラックリストに載るのはプラグインだけ
 ブラックリストが管理されるアーティファクトは、プラグインだけで、
 一般のライブラリは関係ない
ようです。

 つまり、例えばリポジトリのダウンやネットワーク障害でアーティファクトの
 ダウンロードに失敗した場合...
  ・プラグイン
   ブラックリストに載る
   リポジトリやネットワークが復旧しても、ブラックリストをクリア(後述)しない限り
   ダウンロードされない

  ・ライブラリ
   ブラックリストに載らない
   リポジトリやネットワークが復旧すれば、自動的にダウンロードされる。
 と言うことになります。

3.ブラックリストの実体
 ブラックリストの実体は、ブラックリスト用のファイルが存在するのではなく、
 ローカルリポジトリのプラグインディレクトリの中にある「maven-metadata-リポジトリID.xml」
 と言うファイル
で、その内容によってブラックリストか否かを判断するようです。

 たとえば、M2_REPO/org/apache/maven/plugins/maven-surefire-plugin/maven-metadata-central.xml を見ると...

 ・通常(ダウンロード成功)時
  ----------------------------------
  <?xml version="1.0" encoding="UTF-8"?>
  <metadata>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <version>2.1.3</version>
   <versioning>
    <latest>2.3</latest>
    <release>2.3</release>
    <versions>
     <version>2.0-beta-1</version>
        :
     <version>2.3</version>
    </versions>
    <lastUpdated>20070301014816</lastUpdated>
   </versioning>
  </metadata>
  ----------------------------------


 ・ブラックリスト時
  ----------------------------------
  <?xml version="1.0" encoding="UTF-8"?>
  <metadata>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
  </metadata>
  ----------------------------------

 のような違いがあります。

4.ブラックリストのクリア
 上述のように、ブラックリストの実体は「maven-metadata-リポジトリID.xml」なので、
 ブラックリストをクリアするには、このファイルをバサッと消してやれば良いです。

 問題は、ローカルリポジトリ内にたくさんある同ファイルの、どれを削除すれば良いか?です。
 いちいちファイルを開いて中身を確認していられません。

 これに対する鍵は、Maven実行時のログです。
 ブラックリスト化されたプラグインが原因でMavenの実行に失敗すれば、

  [INFO] Repository 'central' will be blacklisted
  [INFO] ------------------------------------------------------------------------
  [ERROR] BUILD ERROR
  [INFO] ------------------------------------------------------------------------
  [INFO] The plugin 'org.apache.maven.plugins:maven-surefire-plugin' does not exist or no valid version could be found

 のようなログが出力されるはずなので、この表示を手掛かりにブラックリスト化されている
 プラグインを特定し、ローカルリポジトリの下を探せば良いわけです。


と、こんなところです。
いまいち、なぜこのような仕組みが導入されたのか良くわかりませんが...

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2007/10/11(木) 23:11:08|
  2. ソフトウェア開発 Maven
  3. | トラックバック:0
  4. | コメント:0

Maven2 Eclipseプラグインの skip パラメタが効かない

Maven2 での(マイナーな)ハマり事例。

Maven2 Eclipseプラグインに、skipと言うパラメタがあります。
説明によると、

 > mvn eclipse:eclipse -Dskip=true

のように指定することで、プラグインの実行をスキップできる、とあります。

。。。が、skip=true を指定しても普通にプラグインが動作してしまう

なぜだ~と思って、Eclipseプラグインのソース(org.apache.maven.plugin.ide.AbstractIdeSupportMojo.java)を見ると、

 /**
  * Skip the operation when true.
  *
  * @parameter expression="${eclipse.skip}" default-value="false"
  */
 private boolean skip;

との記述が。
パラメタ名が、skip じゃなくて eclipse.skip になってるじゃないの。

と言うわけで、

 > mvn eclipse:eclipse -Declipse.skip=true

で、プラグインの実行をスキップできました。



ちなみに、なぜeclipseプラグインの実行をスキップさせたいと思ったかと言うと。。。

依存ライブラリを、ソースコード付きでダウンロードしたい
 ソースコード付きで依存ライブラリをダウンロードすることで、Eclipseで依存ライブラリ
 のクラスを開いたときに、そのソースコードを表示してくれるようになります。
 アーキテクトのような役回りだと、外部から入手したライブラリのソースコードを
 読まなければならないことも多々ありますし、デバッグでブレークポイントも置けるので
 実は結構重要です。

.classpath、.project は、生成させたくない。
 Eclipseプラグインで、pom.xml をベースに .classpath、.project を生成できますが、
 一部思ったとおりに生成してくれないところがあります。
 なので、.classpath、.projectもあらかじめ用意しておいたものを配布したい。

つまり、.classpath、.project は生成してほしくないけど、依存ライブラリはソースコード付きでダウンロードしたかったので、
プラグインの実行をスキップすれば、依存ライブラリはダウンロードされるが、.classpath、.projectは生成されない、
と言うことを実現できるのではないか、と考えたわけです。

。。。で、結果。
ダメでした。
eclipse.skip=true を指定すると、依存ライブラリのダウンロードまでスキップされてしまいました


その後、他のプラグインも調べたところ、dependencyプラグインのsourcesゴールを実行することで、
依存ライブラリをソースコード付きでダウンロードできることがわかりました。

あー疲れた。



テーマ:プログラミング - ジャンル:コンピュータ

  1. 2007/09/18(火) 22:52:09|
  2. ソフトウェア開発 Maven
  3. | トラックバック:0
  4. | コメント:0
次のページ

プロフィール

crossroad

Author:crossroad
関西在住。男。
フリーランスのソフトウェアエンジニア。
エレキベース(Rock&Roll)とお酒が好物でございます。

カテゴリー

タグリスト

Java F1 フリーランス ベーシスト HARRY TheStreetSliders iPhone FX お酒 Seasar Maven eclipse Wicket マイホーム 野球 プロジェクトファシリテーション Rails Ruby UML お店 ソフトウェア Tomcat S2Flex2 jsf Teeda Eclipse タグライブラリ ajax タスク europa mylyn trac 

ブログ内検索

最近の記事

最近のコメント

最近のトラックバック

カレンダー

03 | 2017/04 | 05
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -

月別アーカイブ

全ての記事を表示する

全ての記事を表示する

Twitter


RSSフィード

リンク

このブログをリンクに追加する

アクセスカウンタ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。