29 7月 2009

其實,我想知道你聽到的是什麼

以下這對話經常出現在我高中下課後

我:香草霜淇淋一個

店員:先生,請問你要什麼口味

我:…

我真的很想知道,你們聽到的是什麼

24 7月 2009

APR for Tomcat6 on Ubuntu 8.10

常用Tomcat的朋友對下面的WARN Message應該不陌生
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production
environments was not found on the java.library.path:
/usr/java/packages/lib/i386:/lib:/usr/lib:/usr/lib/jni
如果不理他其實也沒什麼影響,只是看久了也會難過,依以往用tomcat的經驗,就是download apr的source,再make install就好了,不過還是Google了一下,果然發現Ubuntu有自帶的package,還好沒做白工自己compile,然後就很開心的執行了下面的cmd
sudo apt-get install libtcnative-1
再來就是重起tomcat6了。 暗,居然開不起來
Jul 24, 2009 3:22:12 PM org.apache.coyote.http11.Http11AprProtocol start
SEVERE: Error starting endpoint
java.lang.Exception: Socket bind failed: [22] Invalid argument
 at org.apache.tomcat.util.net.AprEndpoint.init(AprEndpoint.java:612)
.....
 at org.apache.commons.daemon.support.DaemonLoader.start(DaemonLoader.java:177)
心理想,這是什麼東西....只好再拜請Google大神了。 修改 /etc/modprobe.d/aliases,找出
alias net-pf-10 ipv6
改成
alias net-pf-10 off
再重起電腦就OK。

21 7月 2009

介於陰影與靈魂之間

------------------------------------------------------------------------------

【聶魯達一百首情詩-17】 聶魯達著/陳黎‧張芬齡譯

我愛你,但不把你當成玫瑰,或黃寶石,
或大火射出的康乃馨之箭。
我愛你,像愛戀某些陰暗的事物,
秘密地,介於陰影與靈魂之間。

我愛你,把你當成永不開花
但自身隱含花的光芒的植物;
因為你的愛,某種具體的香味
自大地升起,暗自生活於我的體內。

我愛你,不知該如何愛,何時愛,打哪兒愛起。
我對你的愛直截了當,不複雜也不傲慢;
我如是愛你,因為除此之外我不知道

還有什麼方式:我不存在之處,你也不存在,
如此親密,你擱在我胸前的手便是我的手,
如此親密,我入睡時你也闔上雙眼。

------------------------------------------------------------------------------

我想你明白,我會一直,往有你的地方走去。

logback: 將各個log file依日期存放在同一目錄

偶爾會有這樣的需求,希望同一天的Log都在同一個目錄下,這時只要將TimeBasedRollingPolicy的FileNamePattern用
%d{yyyy/MM/dd/}/這類的Pattern就可以達成囉。

請見以下例子
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
	<appender name="SYSTEM" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<Prudent>true</Prudent>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<FileNamePattern>%d{yyyy/MM/dd/}/System.log</FileNamePattern>
		</rollingPolicy>
		<layout class="ch.qos.logback.classic.PatternLayout">
			<Pattern>%d [%thread] %-5level %logger{35} - %msg%n
			</Pattern>
		</layout>
	</appender>
	<appender name="MAIL" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<Prudent>true</Prudent>
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<FileNamePattern>%d{yyyy/MM/dd/}/Mail.log</FileNamePattern>
		</rollingPolicy>
		<layout class="ch.qos.logback.classic.PatternLayout">
			<Pattern>%d [%thread] %-5level %logger{35} - %msg%n
			</Pattern>
		</layout>
	</appender>
	<root level="INFO">
		<appender-ref ref="SYSTEM" />
		<appender-ref ref="MAIL" />
	</root>
</configuration>

20 7月 2009

logback 二、三事

(1)要用Logback當然就一併用slf4j,Maven2的dependencies就加入:

<dependency>
	<groupId>ch.qos.logback</groupId>
	<artifactId>logback-classic</artifactId>
	<version>0.9.16</version>
	<type>jar</type>
</dependency>
<!-- 用以取代commons-logging -->
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>jcl-over-slf4j</artifactId>
	<version>1.5.8</version>
	<type>jar</type>
</dependency>
<!-- 用以取代Log4j,若確定系統中都是透過commons-logging並未直接
呼叫log4j的話可以不用加此設定-->
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>log4j-over-slf4j</artifactId>
	<version>1.5.8</version>
	<type>jar</type>
</dependency>

(2)logback-test.xml 與 logback.xml
Logback預設會先找classpath下是否有logback-test.xml,若沒有的話再找logback.xml,若都沒有就用預設的configuration.
所以如果是採用Maven預設的Source Code Structure的話,只要在src/test/resources/下放一個test專用的logback-test.xml就可以專門記錄test產生log.而不需要特別再去改正常系統的logback.xml.

(3)debug mode與automatically reloading
Logback有個機制可以檢視系統載入的logback configuration,還可以定時確認logback.xml是否有被改變而重新載入改變後的設定

<configuration debug="true" scan="true" scanPeriod="30 seconds">
</configuration>
其中debug="true"就是開啟debug mode,會列出目前載入設定檔的名稱,裡面的logger,appender也會列出來。
而scan="true"就是啟用automatically reloading,scanPeriod則可以設定每隔多久檢查是否有更改而載入的時間。

(4)可以設定變數
1. 直接指定Properties name and value.

<property name="USER_HOME" value="/home/elliot" />
2. 利用file指定properties file location
<property file="src/main/resources/system.properties" />
3. 使用resource在classpath中找properties file
<property resource="system.properties" />
就可以在logback.xml中使用${USER_HOME}來控制Log

(5)RollingFileAppender supports automatic file compression。
只要用FixedWindowRollingPolicy或TimeBasedRollingPolicy就可以自動壓縮。

<FileNamePattern>${namepattern}.log.zip/.gz</FileNamePattern>
在FileNamePattern內最後加上.zip就會用zip壓縮,而加入gz即會使用gzip壓縮log.

(6)有趣的Filter
1. 可以利用LevelFilter只接收單一種類Level的Log

<filter class="ch.qos.logback.classic.filter.LevelFilter">
	<level>ERROR</level>
	<onMatch>ACCEPT</onMatch>
	<onMismatch>DENY</onMismatch>
</filter>
這個Filter相當方便,有時在DEBUG時只希望看ERROR的部份,這個Filter可以讓我專注於ERROR的資料。
2. 利用EvaluatorFilter接收含有特別意義的Log
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
	<evaluator name="myEval">
		<expression>message.contains("billing")</expression>
	</evaluator>
	<OnMismatch>NEUTRAL</OnMismatch>
	<OnMatch>DENY</OnMatch>
</filter>
這個Filter也相當有用,當我希望取得具有特定字串或Exception的Log時,這個Filter能很方便的取得需要的資料。

17 7月 2009

不要舉報我

西斯版為什麼好笑?請見範例,現在還是看一遍笑一遍啊

-----------------------------------

作者: ohyeahhh (古大熙) 看板: sex

標題: [心得] 近來西斯版的文章
時間: Tue Jun 9 21:18:37 2009
現在我依最近西斯版回文較多的文章題目,來後以各板可能的推文來加以分析
如有不同意或不正確之處,還請各位板友不吝嗇指正


[討論] 如果強暴罪最重可求處死刑...

Joke →:笑點勒 幹你娘 我走錯板了嗎
Boy-Girl →:愛不是這樣的,怎麼會有人在沒有愛的情況下還可以發生這種事
法西斯 →:那些賤男人,最好通通都給老娘我去死一死
西斯板 →:改判肛刑,讓牠們知道被捅的滋味,五樓你說好嗎
→:五樓都跟士官長肛肛好了,他沒再怕
→:電梯向下


[認真]女生在床上的時候,該叫些什麼

Joke →:笑點勒 幹你娘 是不會去問版喔
Boy-Girl →:心靈上的契合,即使沒有言語上的交流,也可以很完美唷
法西斯 →:叫甚麼不一定啦,但我男朋友就超喜歡我們在做那檔事的時候叫我稱讚他
→:推1F,適度地給男朋友鼓勵一下,真的能增加情趣
西斯板 →:你是我這輩子見過最大的男生
→:我聽了~~~我聽了~~~
→:邱若男,我要幹死你
→:歐歐歐歐 你是我的花朵
→:洽卡洽卡洽卡洽卡洽卡洽卡洽卡洽卡....咻咻~~~~
→:推文超好笑的啦XDDDDDDDDDDDDDDDDDD借轉就可
[m [32m※ [1m***** [;32;40m:轉錄至看板 joke [m


[心得] puma的特徵

Joke →:笑點勒 幹你娘 你媽知道你在這邊發廢文嗎
Boy-Girl →:說穿了,她們只是在愛情道路上迷途的羔羊,祝她們早日找到自己的真愛
法西斯 →:甚麼pu不pu,都是一群死阿宅追不到我們就愛叫我們puma,也不照照鏡子
→:對阿,就是有男生愛創出這種侮蔑我們女性的暱稱,是不是男生阿
西斯板 →:在各百貨公司8F體育專櫃出沒
→:內衣除了白色跟阿婆米色系列,其他顏色都可以在她們的衣櫃裡都找的到
→:在夜店看到歪國人就勃起的濃妝妹
→:推3F XDDDDDDDDDDDDDDD


[認真] 電愛習慣

Joke →:笑點勒 幹你娘 你捏捏自己的LP 這哪裡好笑
Boy-Girl →:我相信只要有心,雙方都肯花心思來經營,電愛也可以得到幸福
法西斯 →:很不切實際,我寧可努力上班工作或好好充實自己
西斯板 →:沒錢交馬子就算了,我連電愛的錢都沒有,越想越悶,去論壇繞一圈好了
→:樓上有股......


[討論] 女友信基督不給督

Joke →:笑點勒 幹你娘 有種不要刪
Boy-Girl →:可以雙方彼此先好好溝通,如果你是真心愛你女朋友,我相信你能體諒她
法西斯 →:當然不要給他們阿,他們有第一次就有第二次,我們要有堅持,感謝主
西斯板 →:基督教其實很Nice的,其中一定有甚麼誤會
→:主耶穌基督在你後面,他現在非常火
→:你可以跟她說其實你是耶穌轉世,射完記得說,阿阿阿阿阿阿阿阿阿門


[認真] 又見瑤瑤

Joke →:有乳必推 科科
Boy-Girl →:不懂你的問題點在哪,但還是祝你早日找到自己的真愛
法西斯 →:......
西斯板 →:阿宅,醒了沒
→:阿宅,醒了沒
→:阿宅,醒了沒
→:阿宅,醒了沒
→:阿宅,醒了沒
→:阿宅,醒了沒
→:========================反詐騙=========================


[認真] 男朋友最近都不碰我

Joke →:笑點勒 幹你娘 不要以為是女生就不噓你
Boy-Girl →:妳應該找個時間好好跟他談一談,看看妳們之間的問題點到底是甚麼
→:可能他是最近工作比較累,不要想太多啦,原PO加油
法西斯 →:一定是在外面有了,賤男人,通通去死死
西斯板 →:閃開!讓專業的來!
→:《私人信箱》有新進信件還沒看 鄉民衝了?
→:去找誠誠,車資他會出放心
→:妳應該趁現在好好試試鄉民的30cm
→:原PO是正妹


[認真] 我每次看到補習班的櫃台小姐就會勃起 這樣正常嗎

Joke →:笑點勒 幹你娘 阿阿阿阿阿阿阿阿阿阿阿阿
Boy-Girl →:你們年紀會差很多嗎,其實年齡也不是問題啦,只要肯用心經營
→:其實不太建議差太多歲的愛情啦,但事情也沒有說一定,原PO加油
法西斯 →:噁心死了,要問這種低俗的問題不會去西斯板問喔
西斯板 →:不正常,請砍掉重練
→:幹,圖哩
→:發文不附圖,此風不可長


[閒聊] 趁家人不在家 推砲~~

Joke →:笑點哩 幹你娘 趕閃我 噓死你
Boy-Girl →:你們真幸福 哈哈 要一直幸福下去喔
法西斯 →:記得一定要叫男朋友帶套喔
西斯板 →:你跟士官長都休假啦?
→:他老爸在門外打槍,他非常火
→:      還 蠻 屌 的
------

Jizz魂

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.240.224.19

碎碎唸(7)

以往下了班就是隨便買點東西,開了Windows桌機就等WOW的登入畫面(我的WOW是放在Windows的啟動....羞)。
現在呢,下了班也是隨便買點東西,開了一台Ubuntu的桌機、一台Ubuntu的筆電跟一台Mac mini,然後就是LPIC跟Ruby交替看著,Mac mini就乖乖當著動物機跑。那這些有什麼好碎碎唸?

Ubuntu 9.04支援ext4,實在是頗快啊!而且常用到的Apache2, Tomcat6, Subversion 1.5.4,要設定的東西實在愈來愈少,東西做這麼好,我以後離不開怎麼辦,公司裡那台Red Hat Server實在想丟掉啊。

從開始用Ubuntu當Server,不再單純只當Coding的開發機,發現自己有很多的錯誤觀念,沒事自己在自己home folder建個java 目錄幹什麼,tomcat跟maven不用Ubuntu綁定的話就下載後丟到/opt下啊,沒事在.profile裡加PATH幹什麼,直接用ln -s加到/usr/bin下啊。Ubuntu要求一定要用sudo來做這些事其實很不錯,可以讓自己想清楚權限的事,Red Hat搞到最後幾乎都用root登入,實在很糟糕啊(是我糟糕不是Red Hat)。

其他要唸的像是:

Valen Hsu的新專輯有點給他失望,雖說不是第一次失望,但之前那首單曲“好聽“實在不錯啊,總覺得後面2張專輯詞曲都不是很優。真想聽Valen唱唱郭靜的“心牆“…倒底最近還有什麼新專輯可以聽的?

Springframework 3停在M3很久了,說好的RC呢?已經延了一個多月了耶,是不是要喝下每朝啊?不然M這麼久也該看醫生吧。

西斯不西斯很久了,快點開版啊!鄉民快不行了吧!

2台Ubuntu,1台Mac mini,那…我那台比前面3台加起來總價還貴的MBP呢?有了iPod Touch,我會沒事開它來聽音樂嗎(誤)?

最後
Elliot@iPhone coming soon!

15 7月 2009

Maven:Properties

Maven:Properties 本篇是參考MavenPropertiesGuide整理的
Maven在POM中可以用的Properties大約可以分為下列幾種
(1)Build in Properties
${basedir}:取得mvn執行時pom.xml的所在目錄
(2)Project Properties
基本上pom.xml中所有的tag都是算在這類,只要加上project這個prefix即可。
${project.name}:可以拿到<name>yourprojectname</name>中的yourprojectname。
${project.version}:可以拿到<version>buildversion</version>中的buildversion。
${project.build.directory}:可以拿到<build><directory>builddirectory</directory></build>中的builddirectory。
而要取得parent的pom.xml資訊,只要將prefix改為parent.project即可。
(3)System Environment Variables
使用env這個prefix,可以取得系統中的變數。
基本上,在console下打env,顯示出的變數只要加上env.這個“prefix“,就能在pom.xml中使用。
${env.M2_HOME}:可以取得Maven的安裝目錄
${env.CLICOLOR}:可以取得mac的terminal是否要顯示顏色。
(4)Java Environment Properties
請參考http://java.sun.com/javase/6/docs/api/java/lang/System.html#getProperties(),其中所有的Key都可以被pom.xml使用。
比較有機會用到的像是
${os.name}:可以知道系統用的OS為何。
${file.separator}:目錄的分隔符號。

要知道這些Properties到底是什麼值其實也有點麻煩,如果沒在pom.xml裡執行也不能確定到底是什麼,但是Maven本身也沒有提供任何方式可以顯示這些Properties。
所以只好利用Antrun中執行echo這task來顯示囉,這是我最直接能想到的,如果有更好的方法也請不吝告知。
在pom.xml中上加
<build>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-antrun-plugin</artifactId>
			<version>1.3</version>
			<executions>
				<execution>
					<phase>initialize</phase>
					<configuration>
						<tasks>
							<echo>basedir:${basedir}</echo>
							<echo>project.name:${project.name}</echo>
							<echo>project.version:${project.version}</echo>
							<echo>project.packaging:${project.packaging}</echo>
							<echo>project.build.finalName:${project.build.finalName}</echo>
							<echo>project.build.directory:${project.build.directory}</echo>
							<echo>project.build.outputDirectory:${project.build.outputDirectory}</echo>
							<echo>env.M2_HOME:${env.M2_HOME}</echo>
							<echo>env.CLICOLOR:${env.CLICOLOR}</echo>
							<echo>settings.localRepository:${settings.localRepository}</echo>
							<echo>java.home:${java.home}</echo>
							<echo>java.version:${java.version}</echo>
							<echo>java.vendor:${java.vendor}</echo>
							<echo>os.name:${os.name}</echo>
							<echo>os.arch:${os.arch}</echo>
							<echo>os.version:${os.version}</echo>
						</tasks>
					</configuration>
					<goals>
						<goal>run</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>
自行修改<tasks>中的<echo> task成你要的,然後只要執行
>$ mvn initialize
就可以看到結果囉。

13 7月 2009

Maven: Create Eclipse Project

用Maven建立Eclipse Project其實頗為容易,第一步用plugin: archetype建立Maven Project,第二步再用plugin: eclipse建立Eclipse要用的設定檔,再來用Eclipse import即可。

1. run mvn archetype:generate
>$ mvn archetype:generate
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'archetype'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO]    task-segment: [archetype:generate] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] Preparing archetype:generate
[INFO] No goals needed for project - skipping
[INFO] Setting property: classpath.resource.loader.class => 'org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader'.
[INFO] Setting property: velocimacro.messages.on => 'false'.
[INFO] Setting property: resource.loader => 'classpath'.
[INFO] Setting property: resource.manager.logwhenfound => 'false'.
[INFO] [archetype:generate {execution: default-cli}]
[INFO] Generating project in Interactive mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
1: local -> sampleweb-archetype (sampleweb-archetype)
2: internal -> appfuse-basic-jsf (AppFuse archetype for creating a web application with Hibernate, Spring and JSF)
.........
16: internal -> maven-archetype-quickstart ()
17: internal -> maven-archetype-site-simple (A simple site generation project)
18: internal -> maven-archetype-site (A more complex site project)
19: internal -> maven-archetype-webapp (A simple Java web application)
..........
41: internal -> gmaven-archetype-basic (Groovy basic archetype)
42: internal -> gmaven-archetype-mojo (Groovy mojo archetype)
Choose a number:  (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/31/32/33/34/35/36/37/38/39/40/41/42) 16: : 

可以見到洋洋灑灑42個Template給你選,若沒合意的就用預設16來建吧。

[INFO] artifact org.apache.maven.archetypes:maven-archetype-quickstart: checking for updates from central
Define value for groupId: : org.elliot.web
Define value for artifactId: : test
Define value for version:  1.0-SNAPSHOT: :
Define value for package:  org.elliot.web: :
Confirm properties configuration:
groupId: org.elliot.web
artifactId: test
version: 1.0-SNAPSHOT
package: org.elliot.web
Y: : y
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating OldArchetype: maven-archetype-quickstart:RELEASE
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: org.elliot.web
[INFO] Parameter: packageName, Value: org.elliot.web
[INFO] Parameter: package, Value: org.elliot.web
[INFO] Parameter: artifactId, Value: test
[INFO] Parameter: basedir, Value: /Users/elliot/Documents/workspacetesting
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] ********************* End of debug info from resources from generated POM ***********************
[INFO] OldArchetype created in dir: /Users/elliot/Documents/workspacetesting/test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------

Maven要求你輸入groupId, artifactId, version, package後就會依你指定的artifactId建立一個Project。

2. run mvn eclipse:eclipse
進入該目錄後,執行mvn eclipse:eclipse
>$ cd test
>$mvn eclipse:eclipse
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'eclipse'.
[INFO] ------------------------------------------------------------------------
[INFO] Building test
[INFO]    task-segment: [eclipse:eclipse]
[INFO] ------------------------------------------------------------------------
[INFO] Preparing eclipse:eclipse
[INFO] No goals needed for project - skipping
[INFO] [eclipse:eclipse {execution: default-cli}]
[INFO] Using as WTP server : null
[INFO] Adding default classpath contaigner: org.eclipse.jdt.launching.JRE_CONTAINER
[INFO] Using source status cache: /Users/elliot/Documents/workspacetesting/test/target/mvn-eclipse-cache.properties
[INFO] Not writing settings - defaults suffice
[INFO] Wrote Eclipse project for "test" to /Users/elliot/Documents/workspacetesting/test.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------

再import至Eclipse即可

import import
3. 如果你有裝m2eclipse,那可以略過2改執行mvn eclipse:m2eclipse
>$ mvn eclipse:m2eclipse
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'eclipse'.
[INFO] ------------------------------------------------------------------------
[INFO] Building test
[INFO]    task-segment: [eclipse:m2eclipse]
[INFO] ------------------------------------------------------------------------
[INFO] Preparing eclipse:m2eclipse
[INFO] No goals needed for project - skipping
[INFO] [eclipse:m2eclipse {execution: default-cli}]
[INFO] Using source status cache: /Users/elliot/Documents/workspacetesting/test/target/mvn-eclipse-cache.properties
[INFO] Using as WTP server : null
[INFO] Not writing settings - defaults suffice
[INFO] Wrote Eclipse project for "test" to /Users/elliot/Documents/workspacetesting/test.
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------

一樣,import至Eclipse即可

import

使用Maven久了之後會發現,上列的方式仍有不便,例如Source Code Structure不符你的需求,相關的Plugin及Dependencies都需要一再加入pom.xml中,所以會希望能建立一個自己常用的範本。這時,你需要用的是archetype:create-from-project,然後將該archetype install到你Maven的repository中。簡單來說,用你現有的Project建立一個Template,之後再執行archetype:generate時再選擇你的template即可。

4. run mvn archetype:create-from-project
>$ mvn archetype:create-from-project
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'archetype'.
[INFO] ------------------------------------------------------------------------
[INFO] Building test
[INFO]    task-segment: [archetype:create-from-project] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] Preparing archetype:create-from-project
[INFO] ------------------------------------------------------------------------
[INFO] Building test
[INFO] ------------------------------------------------------------------------
[INFO] No goals needed for project - skipping
[INFO] Setting property: classpath.resource.loader.class => 'org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader'.
[INFO] Setting property: velocimacro.messages.on => 'false'.
[INFO] Setting property: resource.loader => 'classpath'.
[INFO] Setting property: resource.manager.logwhenfound => 'false'.
[INFO] [archetype:create-from-project {execution: default-cli}]
[INFO] Setting default groupId: org.elliot.web
[INFO] Setting default artifactId: test
[INFO] Setting default version: 1.0-SNAPSHOT
[INFO] Setting default package: org.elliot.web
[INFO] Archetype created in target/generated-sources/archetype
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------

Maven會將archetype範本產生在target/generated-sources/archetype目錄下,如果還有需要可以進到該目錄,若沒問題的下可以進行下一步

5. run mvn install
先進入target/generated-sources/archetype後再執行mvn install
>$ cd target/generated-sources/archetype/
>$ mvn install
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building test-archetype
[INFO]    task-segment: [install]
[INFO] ------------------------------------------------------------------------
[INFO] [resources:resources {execution: default-resources}]
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 7 resources
[INFO] [resources:testResources {execution: default-testResources}]
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/elliot/Documents/workspacetesting/test/target/generated-sources/archetype/src/test/resources
[INFO] Setting property: classpath.resource.loader.class => 'org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader'.
[INFO] Setting property: velocimacro.messages.on => 'false'.
[INFO] Setting property: resource.loader => 'classpath'.
[INFO] Setting property: resource.manager.logwhenfound => 'false'.
[INFO] [archetype:jar {execution: default-jar}]
[INFO] [archetype:add-archetype-metadata {execution: default-add-archetype-metadata}]
[INFO] [archetype:integration-test {execution: default-integration-test}]
[INFO] [install:install {execution: default-install}]
[INFO] Installing /Users/elliot/Documents/workspacetesting/test/target/generated-sources/archetype/target/test-archetype-1.0-SNAPSHOT.jar to /Users/elliot/.m2/repository/org/elliot/web/test-archetype/1.0-SNAPSHOT/test-archetype-1.0-SNAPSHOT.jar
[INFO] [archetype:update-local-catalog {execution: default-update-local-catalog}]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
6. run mvn archetype:generate -DarchetypeCatalog=local
再來就可以試者用自已的Template來建立Project了,不過這時要注意,由於Maven將你的Template加入local端的Catalog(存放 archetype的名稱),所以在run plugin:archetype:generate要加個參數指到local端的Catalog。
>$ mvn archetype:generate -DarchetypeCatalog=local
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'archetype'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO]    task-segment: [archetype:generate] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] Preparing archetype:generate
[INFO] No goals needed for project - skipping
[INFO] Setting property: classpath.resource.loader.class => 'org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader'.
[INFO] Setting property: velocimacro.messages.on => 'false'.
[INFO] Setting property: resource.loader => 'classpath'.
[INFO] Setting property: resource.manager.logwhenfound => 'false'.
[INFO] [archetype:generate {execution: default-cli}]
[INFO] Generating project in Interactive mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
1: local -> sampleweb-archetype (sampleweb-archetype)
2: local -> test-archetype (test-archetype)
Choose a number:  (1/2): 

這時就能看到剛才加入的Template供選擇了囉!

Maven: Basic Concepts(Lifecycle, Phase, Goal)

Lifecycle / Phase / Goal
  • A build lifecycle is made up of phases.
    lifecycle將各phase有順序性的串連起來,所以當你指定執行一個phase時,maven將會執行排在其之前的所有phases.


  • A phase is made up of goals.
    一個Phase可以綁定多個Goals,但一般只有預設的一個Goal會被執行,所以要執行其他的Goal時,
    必需明白指出所要執行Goal。一般來說是以plugin:goal來表示,例如compile:test-compile


  • 說明下上面兩者的差別,例如test-compile這個phase,實際上是要執行compiler:testCompile,但是分別執行的結果如下
  • mvn test-compile
    >$ mvn test-compile
    [INFO] Scanning for projects...
    [INFO] ------------------------------------------------------------------------
    [INFO] Building Maven
    [INFO]    task-segment: [test-compile]
    [INFO] ------------------------------------------------------------------------
    [INFO] [resources:resources {execution: default-resources}]
    [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
    [INFO] skip non existing resourceDirectory /Users/elliot/Documents/workspacetesting/test/src/main/resources
    [INFO] [compiler:compile {execution: default-compile}]
    [INFO] No sources to compile
    [INFO] [resources:testResources {execution: default-testResources}]
    [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
    [INFO] skip non existing resourceDirectory /Users/elliot/Documents/workspacetesting/test/src/test/resources
    [INFO] [compiler:testCompile {execution: default-testCompile}]
    [INFO] No sources to compile
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESSFUL
    [INFO] ------------------------------------------------------------------------
    
    maven認出test-compile是一個Phase,所以執行了排在test-compile之前的Phase,
    如generate-resources、compile、generate-test-resource,最後在執行完test-compile
    (其實就是compiler:testCompile)後結束。



  • mvn compiler:testCompile
    >$ mvn compiler:testCompile
    [INFO] Scanning for projects...
    [INFO] ------------------------------------------------------------------------
    [INFO] Building Maven
    [INFO]    task-segment: [compiler:testCompile]
    [INFO] ------------------------------------------------------------------------
    [INFO] [compiler:testCompile {execution: default-cli}]
    [INFO] No sources to compile
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESSFUL
    [INFO] ------------------------------------------------------------------------
    
    
    Maven認出這是一個Goal所以只執行了compiler:testCompile就結束,並未執行其他的Goals。



  • Maven預設了三個Lifecycle ,各包涵了下列Phases.
    1. Clean Lifecycle
      • pre-clean
      • clean
      • post-clean
    2. Default Lifecycle
      • validate
      • initialize
      • generate-sources
      • process-sources
      • generate-resources
      • process-resources
      • compile
      • process-classes
      • generate-test-sources
      • process-test-sources
      • process-test-resources
      • test-compile
      • process-test-classes
      • test
      • prepare-package
      • package
      • pre-integration-test
      • integration-test
      • post-integration-test
      • verify
      • install
      • deploy
    3. Site Lifecycle
      • pre-site
      • site
      • post-site
      • site-deploy
    並不是所有的Phase都需要被執行,例如validate,在一般的情形下,單獨執行這個Phase會出現
    No goals needed for project - skipping而結束。
    而有些Phase會因設定的不同而執行不同的Goal,
    例如package,會因為你所設的packaging而執行war:war或jar:jar等不同的Goal。

    ECTO3 TEST

    Just test for ecto.

    continue edit



    08 7月 2009

    Development Tools on Mac

    習慣用的IDE當然是Eclipse啦,換個IDE就差不多變成癈人了,想當初從JBuilder換到Eclipse也是痛苦了很長一段時間,並不是IDEA或Netbeans不好,但是實在是沒什麼時間再習慣另一個IDE,除非Eclipse不再開發了,要不應該會一直用下去吧。
    用Eclipse當然要加些Plugin:
    MyEclipse:早期我一定要用的是MyEclipse,不過實在愈來愈肥,而且更新速度愈來愈慢(跟Eclipse更速度來比),所以在Ganymede之後就沒再用了,單純用Eclipse JEE的版本倒也頗為愉快。
    m2eclipse: http://m2eclipse.codehaus.org/,現在如果少了這個Plugin,我也算是個癈人了,Build、Test、Package都要靠Maven,在IDE裡可以快速執行Maven非這個Plugin不可。
    Subversive: http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/,在Windows的話首選應該是Sublipse,但是在Mac裡,Eclipse內建的Subversive也算是不錯了,而且更新速度跟得上Eclipse的改版,所以在Mac裡我都是用Subversive來跟SVN接。
    SpringIDE: http://dist.springframework.org/release/IDE,沒有Spring,那還能做案子嗎?有了這Plugin,在寫Spring 設定XML時方便多了,再也不用記Class裡有哪些field,其它設定檔裡有哪些Bean。
    Yourkit: http://www.yourkit.com/download/yourkit80_eclipse34/,這東西本身是要錢的,單下Plugin沒用,方便看程式裡Thread、Memory、Instance、Exception等各項資訊,主要是怕有Thread deadlock,Memory leak的問題,有這工具方便多了。Performance 倒不是我特別在意的。
    Properties Editor: http://propedit.sourceforge.jp/eclipse/updates/,多語系Properties files的編寫工具,我可不想再回頭用console來編,雖說Jinto也很不錯,但它相容性較差是我放棄的主因。
    再來跟DB有關的Client,我多是用Navicat,因為主要使用的DB不是Oracle就是Mysql,免費的Navicat lite 已經差不多夠了,Eclipse 中雖然有內建的DB Explorer,但說實話,實在不好用…
    寫這些其實・・・只是為了記Plugin的URL啦