JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java Tools  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to topicthreaded modego to previous topicgo to next topic
話題被移動
該話題已被移動 - koji , 2006-08-30 09:47
如果您尚不清楚該話題被移動的原因,請參考論壇規則以及本版公告或者聯系本版版主。
本主題所含的標籤
無標籤
作者 如何写Maven的POM.xml文件? [精華]
jiangshachina

Hi, Java!



發文: 565
積分: 1
於 2006-08-24 19:29 user profilesend a private message to usersend email to jiangshachinareply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
使用Maven时,一般情况下都是使用它所规定的目录结构(这也是官方提倡的)。但是否能够自己定制目录结构。
在Eclipse中使用Maven的插件,对已有的project使用Maven,那么此时的目录结构就不一定会遵循Maven的规范目录结构了。
现在就是要对以前的项目使用Maven,但这些项目也不Eclipse中。
请问我应用如何做?
Stupid


jiangshachina edited on 2006-08-28 11:19
reply to postreply to post
a cup of Java, cheers!
同是Java爱好者,相逢何必曾相识!
作者 Re:可否不使用Maven的规范路径? [Re:jiangshachina]
hkdennis2k





發文: 1926
積分: 6
於 2006-08-24 19:53 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
修改 pod.xml

reply to postreply to post
作者 Re:可否不使用Maven的规范路径? [Re:jiangshachina]
jiangshachina

Hi, Java!



發文: 565
積分: 1
於 2006-08-24 20:10 user profilesend a private message to usersend email to jiangshachinareply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
能否说的具体一些。
如,我有一个Eclipse工程Data,Eclipse工作区名就叫workspace。src目录是源代码的目录,bin是编译后class的目录。
1
2
3
4
5
6
7
8
9
<project>
  ...
  <build>
    <sourceDirectory>D:\workspace\Data\src</sourceDirectory>
    <outputDirectory>D:\workspace\Data\bin</outputDirectory>
    ...
  </build>
  ...
</project>
我已经在POM.xml中作了上述定义,但要加载需要使用的包,应该用什么元素进行定义?


jiangshachina edited on 2006-08-24 20:21
reply to postreply to post
a cup of Java, cheers!
同是Java爱好者,相逢何必曾相识!
作者 Re:可否不使用Maven的规范路径? [Re:jiangshachina]
alien

小弟劣作一幅



發文: 772
積分: 6
於 2006-08-25 01:18 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
加載使用的包... 你指的是 JAR 之類?

Maven 其中一樣最重要的功能就是集中管理各樣 artifacts, 當中包括各類 3rd party library. 只要在 <build><depedency> 下面 define 好需要用到的 artifacts, maven 就會幫你去下載及取得其他相關的 dependencies.

我覺得你在使用上出了幾個大問題

1) 我想你先不要理會 eclipse, 先試明白了 Maven 的功能和了解其使用哲學. 不然連 dependency 這些基本的東西也未搞清楚那可是很難再繼續下去的

2) 我會建議你使用 Maven 的 default path. 畢竟那真的比較清楚也能顧及各類情況. 但就算你不用, 也請你統一. 不要一些現有的 project 用一套, 其他 project 又用一套. 把這些自己定的規則放在一個 global 的 parent POM 內, 所有 top-level project 都設這個為 parent project.

3) 一般而言, 寫好 POM, 再由 POM 用 eclipse:eclipse 的 goal 來 generate Eclipse 的 project , 然後再加修改一點該是比較方便的做法, 你試試這樣做看看, 比起直接用回現在的 eclipse project 哪一個對你會比較方便?

我沒有試過 那個 Maven Plugin for Eclipse, 讓我這幾天也試試 (反正正在為公司建立 Maven 的使用範本 Tongue ), 大家再交流一下吧 Smile


reply to postreply to post

public class Alien {
public boolean isNewbie() {
return true;
}
public String toString() {
return "請大家多多指教";
}
}
作者 Re:可否不使用Maven的规范路径? [Re:jiangshachina]
jiangshachina

Hi, Java!



發文: 565
積分: 1
於 2006-08-25 08:44 user profilesend a private message to usersend email to jiangshachinareply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
谢谢,Maven确实是刚刚开始学,我继续研究。Smile
但对于POM中使用的各种element应该在哪里找?
我在Apache上一直都没找到一个全面的说明,只是看了那个Super POM。

再问一个:artifact是指什么?
经常看到,但不能确切地理解它的内涵。


jiangshachina edited on 2006-08-25 08:54
reply to postreply to post
a cup of Java, cheers!
同是Java爱好者,相逢何必曾相识!
作者 Re:可否不使用Maven的规范路径? [Re:jiangshachina]
jiangshachina

Hi, Java!



發文: 565
積分: 1
於 2006-08-25 17:19 user profilesend a private message to usersend email to jiangshachinareply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Maven 其中一樣最重要的功能就是集中管理各樣 artifacts, 當中包括各類 3rd party library. 只要在 <build><depedency> 下面 define 好需要用到的 artifacts, maven 就會幫你去下載及取得其他相關的 dependencies.
关于这一点,我还是很不清楚。
我就是使用自己机器中的包,也不需要Maven去网上下载。
Stupid


reply to postreply to post
a cup of Java, cheers!
同是Java爱好者,相逢何必曾相识!
作者 Re:可否不使用Maven的规范路径? [Re:jiangshachina]
jiangshachina

Hi, Java!



發文: 565
積分: 1
於 2006-08-25 20:02 user profilesend a private message to usersend email to jiangshachinareply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
首先使用goal install:install-file将使用的jar包安装到local repository中,然后再使用dependence就可以成功编译了。
但这种方法仍然不理想,我不可能把所有需要的包都事先安装到local repository中...
Smile Stupid


reply to postreply to post
a cup of Java, cheers!
同是Java爱好者,相逢何必曾相识!
作者 Re:可否不使用Maven的规范路径? [Re:jiangshachina]
alien

小弟劣作一幅



發文: 772
積分: 6
於 2006-08-25 22:27 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list

谢谢,Maven确实是刚刚开始学,我继续研究。Smile
但对于POM中使用的各种element应该在哪里找?
我在Apache上一直都没找到一个全面的说明,只是看了那个Super POM。

再问一个:artifact是指什么?
经常看到,但不能确切地理解它的内涵。

http://maven.apache.org/guides/index.html
Maven 的 official 的各類 guides, introduction 等的資料.
http://maven.apache.org/ref/current/maven-model/maven.html
POM 的 reference 也是在裡面找得到

www.mavenbook.org
這本書很好, 很多觀念都有條理的解釋清楚, 很多甚至在 maven 的 guides 也沒有寫清楚的

artifact 你可以想為 "產品", 就是由 Maven 所建立的產品. 可以是一個 JAR, WAR, EAR, 甚至一個單純的 POM (例如作為其他 POM 的 Parent). 詳細還是看資料吧


关于这一点,我还是很不清楚。
我就是使用自己机器中的包,也不需要Maven去网上下载。

首先使用goal install:install-file将使用的jar包安装到local repository中,然后再使用dependence就可以成功编译了。
但这种方法仍然不理想,我不可能把所有需要的包都事先安装到local repository中...


免費的 public 3rd party library, 在 Maven 等的幾個大 repository 都有, 請用. 因為如果真的要做得好一個 artifact deploy 在 repository 上, 還有其他細節要顧及, 比如 某 library 的 dependency 之類. 直接用人家 deploy 好的 artifact 會比較方便

然後, 把 3rd party lib install 到 local repo 只該是在下面的情況下做:
1) public remote repo 沒有或版本, 或
2) public remote repo 有錯誤

但當成功 build 得到後, 請把這些 artifacts 放在自己公司集中的 remote repository 內, 這樣, 公司裡的人才能夠分享得到.

另外, public 的 libraries 為免每一個人都要重新下載一份, 建議弄一個 proxy 來代替 public remote repo. 只要有人經 proxy 從 internet 下載過一份, 其他人就不用再下載了. 可以找一找 Proximity. 把公司內部的 remote repository, 和 internet 上的幾個主要 repository 都集中由 Proximity 管理.


reply to postreply to post

public class Alien {
public boolean isNewbie() {
return true;
}
public String toString() {
return "請大家多多指教";
}
}
作者 Re:可否不使用Maven的规范路径? [Re:jiangshachina]
jiangshachina

Hi, Java!



發文: 565
積分: 1
於 2006-08-26 12:19 user profilesend a private message to usersend email to jiangshachinareply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
http://maven.apache.org/ref/current/maven-model/maven.html
POM 的 reference 也是在裡面找得到
That's very my want Big Smile
www.mavenbook.org
這本書很好, 很多觀念都有條理的解釋清楚, 很多甚至在 maven 的 guides 也沒有寫清楚的
这本书好像有点老吧,从Mergere下了一本免费书Better Build with Maven,仍然感谢!
免費的 public 3rd party library, 在 Maven 等的幾個大 repository 都有, 請用. 因為如果真的要做得好一個 artifact deploy 在 repository 上, 還有其他細節要顧及, 比如 某 library 的 dependency 之類. 直接用人家 deploy 好的 artifact 會比較方便

然後, 把 3rd party lib install 到 local repo 只該是在下面的情況下做:
1) public remote repo 沒有或版本, 或
2) public remote repo 有錯誤
我并不想安装这些第3方包,只想让它们仍然在原来的位置,而同时我也能够使用到它们。

必须感谢您的热心,哈哈 Big Smile


jiangshachina edited on 2006-08-26 19:01
reply to postreply to post
a cup of Java, cheers!
同是Java爱好者,相逢何必曾相识!
作者 Re:可否不使用Maven的规范路径? [Re:jiangshachina]
jiangshachina

Hi, Java!



發文: 565
積分: 1
於 2006-08-26 19:05 user profilesend a private message to usersend email to jiangshachinareply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我的这种想法可能还是受到使用Ant的影响。
使用Ant时,可以任意指定jar文件及其路径,但在Maven中感觉还很不方便(应该是由于还不会使用Maven)。
目前使用的包中,有一些是公司自己开发的,肯定是无法从网上下载的。这些包的数量比较大,而且也可能会被更新,所以也不方便把它们都安装到local repository中。还是希望能像Ant那样随心指定(我脑筋是不是有点死啊^_^)。

在看到的例子中都是如下形式
1
2
3
4
5
6
7
8
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
用这种形式,那么这些jar文件也必须存在于repository(remote or local)中,可这正不是我所期望的形式。


jiangshachina edited on 2006-08-26 20:23
reply to postreply to post
a cup of Java, cheers!
同是Java爱好者,相逢何必曾相识!
作者 Re:可否不使用Maven的规范路径? [Re:jiangshachina]
alien

小弟劣作一幅



發文: 772
積分: 6
於 2006-08-27 00:27 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list

这本书好像有点老吧,从Mergere下了一本免费书Better Build with Maven,仍然感谢!

不不... 看來是我搞錯了 XD 我想給你的正是 Better Build with Maven... Tongue
我記得之前在閒聊別人給 mavenbook.org 是找到 Better Build with Maven 的... 不知道為什麼現在不是了 o_oa


我并不想安装这些第3方包,只想让它们仍然在原来的位置,而同时我也能够使用到它们。

不安裝就沒意思了. Maven 的使用哲學並非如此.

雖然你也可以硬幹: Dependency 可以設 scope 為 "system", 然後再靠 <systemPath> 來給 library 的 path. 但這種做法很沒有意義, 把 Maven 其中最重要的 artfiact 的中央管理, 和 dependency resolving 的功能都抹煞掉了.


我的这种想法可能还是受到使用Ant的影响。
使用Ant时,可以任意指定jar文件及其路径,但在Maven中感觉还很不方便(应该是由于还不会使用Maven)。
目前使用的包中,有一些是公司自己开发的,肯定是无法从网上下载的。这些包的数量比较大,而且也可能会被更新,所以也不方便把它们都安装到local repository中。还是希望能像Ant那样随心指定(我脑筋是不是有点死啊^_^)。

你是想得太死了 Tongue

就算是自己開發的 artifacts, 也該被 install 到 repository 的. 尤其是其他人會用到的包, 更加需要.

這種方法不是不方便哩, 這樣反而方便呀. 你不再需要準備不同的 lib 的 jar etc. 你只要在 POM 中說出自己想用什麼, Maven 就幫你搞定了--連同那些包的 dependent lib, 和 dependent lib 的 dependent lib.....

說到更新的問題, 這又涉及 release procedure 等的問題了. 首先, 就算一直更新, 安裝到 local repo 也沒有什麼關係吧? 反正只是自己機器裡面的東西而已. 而在 remote repo 方面, 如果是一直被更新, 有兩種方向你可以去看看

1) 因為版本未正式 release 所以要持續更新, 這種是 所謂 Snapshot. Snapshot 的artifact Maven 是會看到有更新就會取得最新版本的
2) 又或者你可以利用 DependencyManagement 來設定 range of version. 比如你想 2.1.x 的版本都可以用到 (基於公司的規例, minor version 一樣的, API 要 backward compatible ), 則可以把該 artifact 的 version 設為 [2.1, 2.2)


alien edited on 2006-08-27 00:30
reply to postreply to post

public class Alien {
public boolean isNewbie() {
return true;
}
public String toString() {
return "請大家多多指教";
}
}
作者 Re:可否不使用Maven的规范路径? [Re:jiangshachina]
jiangshachina

Hi, Java!



發文: 565
積分: 1
於 2006-08-27 19:32 user profilesend a private message to usersend email to jiangshachinareply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我将自己需要的jar全部安装到了local repository中,然后将它们都加到了pom的<dependencies><dependency>中(这种写法,比写Ant还多Big Smile)。
在执行compile时,发现了一个奇怪的问题,我一共引用了20多个公司开发的jar,但其中有2个jar,maven会试图到central repository中下载,只是可能下载不到,才会到local repo中寻找。对此,我很疑惑Stupid每个jar的install-file过程都是一样的,而且都为它们加了一个artifact-version.pom文件。

另外,我在pom的dependencies或plugins中都没有指定compile或test需要的包或插件,我运行mvn compilemvn test都没问题;但如果我不在dependencies中指定公司开发的jar,那么执行compile时,就会报找不到某某类型。这两种情况为何不同?
使用dependency与使用plugin的有什么区别?如使用junit,可以将它放在plugins中,也可以放到dependencies中。
Maven是否有自动在repository中搜索适合的包的能力,而不需要我特别指定使用哪些jar(要求过分吗Tongue)

因為版本未正式 release 所以要持續更新, 這種是 所謂 Snapshot. Snapshot 的artifact Maven 是會看到有更新就會取得最新版本的
如果Maven在repository中发现某个artifact有更高版本的jar,就会自动使用高版本的?
如果我指定使用了某个版本呢?


jiangshachina edited on 2006-08-28 09:50
reply to postreply to post
a cup of Java, cheers!
同是Java爱好者,相逢何必曾相识!
作者 Re:可否不使用Maven的规范路径? [Re:jiangshachina]
jiangshachina

Hi, Java!



發文: 565
積分: 1
於 2006-08-27 20:20 user profilesend a private message to usersend email to jiangshachinareply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
可以设置多个repository
http://maven.apache.org/guides/mini/guide-multiple-repositories.html
但intall file时,如何把它们install到特定的repositry中呢?
http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html
只能安装到setting.xml中设定的local repository中吗?


jiangshachina edited on 2006-08-28 08:33
reply to postreply to post
a cup of Java, cheers!
同是Java爱好者,相逢何必曾相识!
作者 Re:可否不使用Maven的规范路径? [Re:jiangshachina]
jiangshachina

Hi, Java!



發文: 565
積分: 1
於 2006-08-28 10:36 user profilesend a private message to usersend email to jiangshachinareply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
在执行compile时,发现了一个奇怪的问题,我一共引用了20多个公司开发的jar,但其中有2个jar,maven会试图到central repository中下载,只是可能下载不到,才会到local repo中寻找。对此,我很疑惑Stupid每个jar的install-file过程都是一样的,而且都为它们加了一个artifact-version.pom文件。
这是由于artifact-version.pom的文件名写的有问题 Blush
一下子安装了几十个jar,还真得小心一点啊 Big Smile


reply to postreply to post
a cup of Java, cheers!
同是Java爱好者,相逢何必曾相识!
作者 Re:可否不使用Maven的规范路径? [Re:jiangshachina]
alien

小弟劣作一幅



發文: 772
積分: 6
於 2006-08-28 12:08 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
jiangshachina wrote:
可以设置多个repository
http://maven.apache.org/guides/mini/guide-multiple-repositories.html
但intall file时,如何把它们install到特定的repositry中呢?
http://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html
只能安装到setting.xml中设定的local repository中吗?

以我所知, install 指的是 local repo.
放到 remote repo 是 deploy


reply to postreply to post

public class Alien {
public boolean isNewbie() {
return true;
}
public String toString() {
return "請大家多多指教";
}
}
作者 Re:如何写Maven的POM.xml文件? [Re:jiangshachina]
jiangshachina

Hi, Java!



發文: 565
積分: 1
於 2006-08-28 13:59 user profilesend a private message to usersend email to jiangshachinareply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
另外,我在pom的dependencies或plugins中都没有指定compile或test需要的包或插件,我运行mvn compile或mvn test都没问题;但如果我不在dependencies中指定公司开发的jar,那么执行compile时,就会报找不到某某类型。这两种情况为何不同?
关于这个问题,我想再说一下。
例如,我要编译一个简单的web应用(servlet)工程,那么Maven会自动下载javax.servlet到local repo,但我在pom.xml的dependency或plugin中并没有声明需要这个jar,而且以后再运行时也没有问题。但对于我自己的jar(都已经安装到了local repo),就必须在denpendence中声明使用,否则会找不到。


reply to postreply to post
a cup of Java, cheers!
同是Java爱好者,相逢何必曾相识!
作者 Re:如何写Maven的POM.xml文件? [Re:jiangshachina]
alien

小弟劣作一幅



發文: 772
積分: 6
於 2006-08-29 02:27 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
jiangshachina wrote:
关于这个问题,我想再说一下。
例如,我要编译一个简单的web应用(servlet)工程,那么Maven会自动下载javax.servlet到local repo,但我在pom.xml的dependency或plugin中并没有声明需要这个jar,而且以后再运行时也没有问题。但对于我自己的jar(都已经安装到了local repo),就必须在denpendence中声明使用,否则会找不到。


這就是 Maven 的其中一個大好處.

比如, 我現在的 applicatoin 要用 Spring, Spring 可能需要用到 log4J, common-lang, common-collection. 你再也不需要理會那麼多, 你只要知道你用到的是 Spring, 然然設定 dependency 為 spring 就可以了. 其他的 log4j, common-lang 和 common-collection 則是 maven 的責任, 從 Spring 的 dependencies 再一直搜尋下去. 這些就是你所謂的自動下載. Dependency 部份, 除了由你自己註明的 dependency 會影響到, project 的 archetype, plugin, artifcat type 等等都會在計算之內.

你自己的 JAR, 那麼當然你要告訴 Maven 才可以了. 你不告訴 Maven, Maven 不可能 (也不該) 自己猜得到你要的是什麼 JAR 嘛.


reply to postreply to post

public class Alien {
public boolean isNewbie() {
return true;
}
public String toString() {
return "請大家多多指教";
}
}
作者 Re:如何写Maven的POM.xml文件? [Re:jiangshachina]
jiangshachina

Hi, Java!



發文: 565
積分: 1
於 2006-08-29 08:31 user profilesend a private message to usersend email to jiangshachinareply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
你自己的 JAR, 那麼當然你要告訴 Maven 才可以了. 你不告訴 Maven, Maven 不可能 (也不該) 自己猜得到你要的是什麼 JAR 嘛.
这一点完全可以想像,只是被junit,compiler这些插件的使用弄蒙了。使我以为Maven可能会自动到local repo中搜索artifact Smile


reply to postreply to post
a cup of Java, cheers!
同是Java爱好者,相逢何必曾相识!
作者 Re:如何写Maven的POM.xml文件? [Re:jiangshachina]
jiangshachina

Hi, Java!



發文: 565
積分: 1
於 2006-08-29 13:23 user profilesend a private message to usersend email to jiangshachinareply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
使用继承时,出了点问题 Stupid
例如,有目录结构D:\maven\example\A\B,其中目录example,A和B中各有一个pom.xml文件。
目录example中的pom.xml
1
2
3
4
5
6
7
8
9
10
11
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>example</groupId>
  <artifactId>example</artifactId>
  <packaging>pom</packaging>
  <version>1.0</version>
 
  <modules>
    <module>A</module>
  </modules>
</project>

目录A中的pom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<project>
  <parent>
    <groupId>example</groupId>
    <artifactId>example</artifactId>
    <version>1.0</version>
  </parent>
 
  <modelVersion>4.0.0</modelVersion>
  <artifactId>A</artifactId>
  <packaging>pom</packaging>
 
  <modules>
    <module>B</module>
  </modules>
</project>

目录B中的pom.xml
1
2
3
4
5
6
7
8
9
10
11
<project>
  <parent>
    <groupId>example</groupId>
    <artifactId>A</artifactId>
    <version>1.0</version>
  </parent>
 
  <modelVersion>4.0.0</modelVersion>
  <artifactId>B</artifactId>
  <packaging>jar</packaging>  
</project>

在validate目录example和B中的pom.xml时,可以成功;但在validate目录A中的pom.xml时,则会试图下载example-1.0.pom,其结果自然要失败。
请问,这是什么原因?


reply to postreply to post
a cup of Java, cheers!
同是Java爱好者,相逢何必曾相识!
作者 Re:如何写Maven的POM.xml文件? [Re:jiangshachina]
jiangshachina

Hi, Java!



發文: 565
積分: 1
於 2006-08-29 15:23 user profilesend a private message to usersend email to jiangshachinareply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
另外,一般情况下父pom在子pom的上一层目录。
如果父pom在子pom的上上一层目录中,可以在子pom的<relativePath>中设定相对路径..\..\pom.xml。此时,invalidate子pom,可以成功。但invalidate父pom,则会失败!报找不到子pom文件。这样的话,应该也需要在父pom中设置子pom文件的相对路径,但在哪里设置呢?


jiangshachina edited on 2006-08-29 16:08
reply to postreply to post
a cup of Java, cheers!
同是Java爱好者,相逢何必曾相识!
作者 Re:如何写Maven的POM.xml文件? [Re:jiangshachina]
jiangshachina

Hi, Java!



發文: 565
積分: 1
於 2006-08-29 15:29 user profilesend a private message to usersend email to jiangshachinareply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
学习一段时间的Maven后,感觉它的主要目标是在project管理上(构建良好的目录结构,便于管理、测试与集成)。对于一些小而具体的工作,就不太关注了。
如,它能够完成我指定的mkdir,copy,delete,archive等等之类的工作吗Stupid(是不是又说回到Ant了Clown)
或者对于这些小工作,就由Ant完成(让Maven调用Ant),而让Maven只关注于工程本身。


jiangshachina edited on 2006-08-29 16:09
reply to postreply to post
a cup of Java, cheers!
同是Java爱好者,相逢何必曾相识!
作者 Re:如何写Maven的POM.xml文件? [Re:jiangshachina]
alien

小弟劣作一幅



發文: 772
積分: 6
於 2006-08-29 19:21 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
先回答你 subproject 的問題:
首先, 除非你install 了 example 及 A 的 pom, 不然的話, 在 B 的目錄下作 compile (我想 validate 也是同一情況), 他該也是會去 "找" A 的 POM 的 (找著會繼續找 example)

這是正常的, 除非你是由 multi-module project 的 parent project 來開始 compile, 這種情況下, 當逐一 compile 子 module 的時候, maven 才會懂得把在這次 compilation compile 到的 POM 直接使用而不去 repo "找".

直接在 子 module 裡面 compile 的話, 只是告知了 maven 你是要繼承某一 POM , Maven 當然會到 repo 去找了 .

不要把POM 繼承 和 multi-module project 畫上等號. 要繼承某一個 POM (即設定 parent) 是不需要一定放在 parent project 的 subdirectory 的. Parent project 也不一定要把你設成他的 modules.

只是一般而言, multi-module project 裡的子 project 都會繼承上層的 project 而已. 但反向的情況也是很常見的 (即, 一個非子 module project 的 POM 繼承自某一另外的 POM, 比如我把公司統一的設定放在公司的一個 global 的 parent POM, 所有頂層 project POM 都要繼承自它)

未知你明不明白我說的是什麼意思? Smile

另你提到 "对于一些小而具体的工作,就不太关注了", 這個只是你還未了解 Maven 的使用哲學, 總是想把它當成 Ant 用吧 Smile

你該去 generalize 你的使用, 比如, 為什麼你要 create directory? 可能是因為你要跑某些 code-generation 的動作. 那麼, 你就該為這動作設立一個 plugin, 讓你的 project 在要做這個動作時, 不必再理會 "how to do", 只需要告訴maven "what to do". 這才是 Maven 這種 "declarative" 的 build tools 的其中一個精要所在 Smile

當然, 我也贊成, 有時為了一些很簡單的東西, 去寫一個 plugin, 真的有點小題大做 :p 但那並不是 maven 不管具體工作, 而是 Maven 的設計哲學不同而已


alien edited on 2006-08-29 21:50
reply to postreply to post

public class Alien {
public boolean isNewbie() {
return true;
}
public String toString() {
return "請大家多多指教";
}
}
作者 Re:如何写Maven的POM.xml文件? [Re:jiangshachina]
jiangshachina

Hi, Java!



發文: 565
積分: 1
於 2006-08-30 09:40 user profilesend a private message to usersend email to jiangshachinareply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
先回答你 subproject 的問題:
首先, 除非你install 了 example 及 A 的 pom, 不然的話, 在 B 的目錄下作 compile (我想 validate 也是同一情況), 他該也是會去 "找" A 的 POM 的 (找著會繼續找 example)

這是正常的, 除非你是由 multi-module project 的 parent project 來開始 compile, 這種情況下, 當逐一 compile 子 module 的時候, maven 才會懂得把在這次 compilation compile 到的 POM 直接使用而不去 repo "找".

直接在 子 module 裡面 compile 的話, 只是告知了 maven 你是要繼承某一 POM , Maven 當然會到 repo 去找了 .

不要把POM 繼承 和 multi-module project 畫上等號. 要繼承某一個 POM (即設定 parent) 是不需要一定放在 parent project 的 subdirectory 的. Parent project 也不一定要把你設成他的 modules.

只是一般而言, multi-module project 裡的子 project 都會繼承上層的 project 而已. 但反向的情況也是很常見的 (即, 一個非子 module project 的 POM 繼承自某一另外的 POM, 比如我把公司統一的設定放在公司的一個 global 的 parent POM, 所有頂層 project POM 都要繼承自它)

未知你明不明白我說的是什麼意思?
我确实没有将inherite与subproject分开,但对于我的例子,这两者应该也没有矛盾吧。
而且在我的前述中,已经表明验证目录B中的pom.xml是可以成功的,它不会去试图下载A中的pom.xml,更没有试图下载example中的pom.xml。

刚才又看了Better Build with Maven中chapter 3的例子(proficio)。
我们可以看看proficio,proficio-stores,proficio-store-memory这三者之间的关系。proficio目录的pom将proficio-stores定义为一个子模块,而proficio-stores中的pom又将proficio-store-memory定义为自己的一个子模块。
其实,验证proficio和proficio-store-memory中的pom都可以成功,而验证proficio-stores中的pom也会失败。这与我的例子出现的问题是一样的。
现在的关键问题在于:为什么第三层的pom可以通过验证;而第二层的pom不能通过验证?

另外,proficio的顶层pom为什么要将它的4个子模块都写到dependencyManagement中?
这有什么意义吗?既然用了继承,那么还需要依赖它们?

一個非子 module project 的 POM 繼承自某一另外的 POM, 比如我把公司統一的設定放在公司的一個 global 的 parent POM, 所有頂層 project POM 都要繼承自它
这一点,也正是我想做的 Big Smile


jiangshachina edited on 2006-08-30 09:45
reply to postreply to post
a cup of Java, cheers!
同是Java爱好者,相逢何必曾相识!
作者 Re:如何写Maven的POM.xml文件? [Re:jiangshachina]
jiangshachina

Hi, Java!



發文: 565
積分: 1
於 2006-08-30 09:57 user profilesend a private message to usersend email to jiangshachinareply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我希望example ,A和B中的pom都能通过验证(即都能够单独使用),就是想在使用pom时能做到按module使用。
例如,example中有模块A1,A2,A3...;模块A1中有子模块B11,B12,B13...;模块A2中有子模块B21,B22,B23...
如果每个模块中的pom都能够单独运行,那么我可以只compile,package,install...某一个模块(当然相互之间有关联的模块除外)。


reply to postreply to post
a cup of Java, cheers!
同是Java爱好者,相逢何必曾相识!
作者 Re:如何写Maven的POM.xml文件? [Re:jiangshachina]
alien

小弟劣作一幅



發文: 772
積分: 6
於 2006-08-30 11:13 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
jiangshachina wrote:
我确实没有将inherite与subproject分开,但对于我的例子,这两者应该也没有矛盾吧。

其實重點是你把兩者混淆了


而且在我的前述中,已经表明验证目录B中的pom.xml是可以成功的,它不会去试图下载A中的pom.xml,更没有试图下载example中的pom.xml。

刚才又看了Better Build with Maven中chapter 3的例子(proficio)。
我们可以看看proficio,proficio-stores,proficio-store-memory这三者之间的关系。proficio目录的pom将proficio-stores定义为一个子模块,而proficio-stores中的pom又将proficio-store-memory定义为自己的一个子模块。
其实,验证proficio和proficio-store-memory中的pom都可以成功,而验证proficio-stores中的pom也会失败。这与我的例子出现的问题是一样的。
现在的关键问题在于:为什么第三层的pom可以通过验证;而第二层的pom不能通过验证?


我知道你問題出在那兒了.

我想你大概是用 mvn validate 吧?
你留意一下 proficio-store-memory 中的 "成功" 訊息是什麼?
"No goals needed for project - skipping"
我想大概是因為單是validate 的話 POM 中沒有動作要做, 所以它直接 skip 掉了. 你試試換成 mvn compile 吧. 你就會知道我所說的是什麼意思了



另外,proficio的顶层pom为什么要将它的4个子模块都写到dependencyManagement中?
这有什么意义吗?既然用了继承,那么还需要依赖它们?

請看書看看 <dependency> 和 <dependencyManagement> 的分別.
後者並非依頼, 而是 當你設 dependency 的話就會用 dependencyManagement 中所預設的. 比如, 在 global 的 POM 設了 dependencyManagement artifiact XYZ version 1.2, 你的 A POM 繼承了 global POM, 那麼在 A 中是 *沒有* depends on XYZ-1.2 的. 但一旦當你在 A 中加了 XYZ 的 dependency (可以不需要 version etc), maven 就會知道你是 depends on XYZ-1.2 了.


我希望example ,A和B中的pom都能通过验证(即都能够单独使用),就是想在使用pom时能做到按module使用。
例如,example中有模块A1,A2,A3...;模块A1中有子模块B11,B12,B13...;模块A2中有子模块B21,B22,B23...
如果每个模块中的pom都能够单独运行,那么我可以只compile,package,install...某一个模块(当然相互之间有关联的模块除外)。

multi-module project 的用意就是讓你由頂層發起, 然後下層都會逐一根據 dependency 都 build 好.

你其實也可以單獨 build, 前題是你要把它的 dependencies (所謂 dependencies 包括了 parent POM) 都 install 了 (在 local 或 remote), 那麼 maven 才能找得到.


reply to postreply to post

public class Alien {
public boolean isNewbie() {
return true;
}
public String toString() {
return "請大家多多指教";
}
}
go to first page go to previous page  1   2  go to next page go to last page
» JWorld@TW »  Java Tools

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8