在想移blog後,是不是要依抽象類別來分,如Maven、Ant甚至Git放到CM,Regex也包括Shell Script。臨時支援他人寫的程式,跳過Ant直接接觸Maven的我,注記一下Ant在manifest.mf生成dependency jar list的方法。 原來的Ant Script摘錄如下:
| <target name="build" depends="compile" description="Compile and generate jar"> <jar destfile="${dist.dir}/compare.jar" compress="true" basedir="${temp.dir}"> <manifest> <attribute name="Main-Class" value="${mainclass}"/> <attribute name="Class-Path" value="lib\commons-collections.jar lib\commons-pool.jar lib\commons-dbcp.jar lib\ojdbc14.jar lib\nls_charset12.jar lib\jdom.jar lib\log4j-1.2.12.jar"/> </manifest> </jar> <copy todir="${dist.dir}" preservelastmodified="true"> <fileset dir="${source.dir}" includes="config.xml,run.bat" /> </copy> <copy todir="${dist.dir}/lib" preservelastmodified="true"> <fileset dir="${lib.dir}" includes="*.jar" /> </copy> </target> |
如上述片段紅字,設定manifest.mf時,Class-Path後跟著是hard code。再擴充的話,就什麼都要加。若要改成自動讀lib目錄裡所有jar,如下:
| <attribute name="Class-Path" value="${libs.project}" /> |
那libs.project的property該如何設置,得在build.xml裡增加以下內容:
| <pathconvert property="libs.project" pathsep=" "> <mapper> <chainedmapper> <!-- remove absolute path –> <flattenmapper /> <!-- add lib/ prefix –> <globmapper from="*" to="lib/*" /> </chainedmapper> </mapper> <path> <!-- lib.dir contains all jar files, in several subdirectories –> <fileset dir="${lib.dir}"> <include name="**/*.jar" /> </fileset> </path> </pathconvert> |
看來設定似乎更累贅,但從英文注釋可以推敲是做什麼目的,設定一次就不擔心hard code拖累。Maven在export jar的manifest.mf也是如出一轍的複雜。
Jemmy 發表在 痞客邦 留言(0) 人氣(511)
這事發生在我用PC自svn下載之前開發的東東所遇,而到Maven Repository URL去看,其實都有這些jar,但在local裡卻沒下載到,以aspectj-1.6.9為例,只有aspectj-1.6.9.jar.lastUpdated和aspectj-1.6.9.pom.lastUpdated而已.後來直接刪除這個1.6.9目錄再對project clean就下載成功.後來去看了lastUpdated內容,如下: #Last modified on: Fri Sep 03 14:24:24 CST 2010
#Fri Sep 03 14:24:24 CST 2010
http\://localhost\:8081/nexus/content/groups/public=1283495064734 應該是我在PC有安裝Nexus Server作為Local Repository有關. 剛同事問我說Maven用的人多嗎?其實在台灣看來真的不多,有時像Regex一樣,好用但真正會用的不多.對我最近常當獨行俠開發者而言,像多請一個人幫你寫程式,只是還是一個人--囧.似乎是今年開始,我能體會過去朋友所說的,欠缺革命情感的team member開發.以前就了解這個孤寂,但到今年才領受到,也算待我不薄了.
Jemmy 發表在 痞客邦 留言(0) 人氣(613)
看來我對Maven的<build>的<plugin>的來龍去脈還不甚了解,它應該是源自這個repository:
http://repo2.maven.org/maven2/org/apache/maven/plugins/。所以maven-compiler-plugin、maven-jar-plugin等都可以應對到這repostiry的出處。 在包成Jar釋給客戶端時,想把不會用到的java檔予以排除編譯之外。其實一開始我就想錯了,真正目的想把不要用到的class不包成jar。所以maven-compiler-plugin是針對*.java的處理,本來預設包成jar時就不會把原始檔放進去,若在<configuration>裡放了<excludes>來排除特定的原始檔,反而把未排除的原始檔包進jar裡,或者在<resources>設定亦同。所以要用maven-jar-plugin來排除特定的class:
| <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.3.1</version> <configuration> <excludes> <exclude>**/Test*.class</exclude> </excludes> </configuration> </plugin> |
Jemmy 發表在 痞客邦 留言(0) 人氣(787)
在包成Jar或war檔時,如何指定加入或排除額外的檔案,如配置檔、圖檔等。在pom.xml設定如下:
| <build> ... <resources> <resource> <directory>src/main/resources</directory> <excludes> <exclude>*.jpg</exclude> <exclude>resources.xml</exclude> </excludes> </resource> </resources> ... </build> |
在<resource>標籤下可透過<includes>和<excludes>做載入或排除額外的資源檔。
Jemmy 發表在 痞客邦 留言(0) 人氣(171)
Jemmy 發表在 痞客邦 留言(0) 人氣(91)
在用第三方的jar時,之前很笨在.m2的repository目錄下手動建置groupId子目錄,其實有現成的語法可以把local的jar檔更新至repository。語法如下:
| mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging> |
這樣在mvn package或mvn install時就不會找不到3rd的jar而無法打包。接著如何設定Jar的MANIFEST.MF,指定Main Class以及把reference的jar全部copy出來。可參考如下pom.xml設定:
| <project> ... <build> <finalName>Foo</finalName> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.2</version> <configuration> <archive> <manifest> <mainClass>com.foo.bar.MainClass</mainClass> <!-- 指定MANIFEST.MF的Main Class --> <classpathPrefix>lib/</classpathPrefix> <!-- 指定MANIFEST.MF的Class Path的前置 --> <addClasspath>true</addClasspath> <!-- 指定MANIFEST.MF的Class Path --> </manifest> <manifestEntries> <mode>development</mode> <url>${pom.url}</url> </manifestEntries> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy</id> <phase>install</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <!-- Copy相依Jar檔至/target目錄下的lib目錄,也與上述的classpathPrefix標籤相符 --> <outputDirectory>${project.build.directory}/lib</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> ... </project> |
Jemmy 發表在 痞客邦 留言(0) 人氣(1,922)
想不到因為專案關係,接觸可能會派上用場的CORBA。CORBA是跨語言的元件模型,底蘊還摸不清楚,先記下如何使用Maven操作CORBA。
| module ChinaApp { interface China { string MorningChina(); }; }; |
上面是CORBA的IDL語言檔,檔名China.idl,再用Java裡提供的IDLJ(舊版叫IDLtoJava)去進行Code Generate,可以在command line下idlj China.idl,執行後產出以module為名的目錄及五個java檔,若是idlj -fall -oldImplBase China.idl,則會多產出一個_ChinaImplBase.java檔。 而到Maven的建置如下:
| <project> ... <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>idlj-maven-plugin</artifactId> <executions> <execution> <goals> <goal>generate</goal> </goals> </execution> </executions> <configuration> <compiler>idlj</compiler> <sources> <source> <includes> <include>YOUR_IDL_FILE.idl</include> </includes> <emitStubs>true</emitStubs> <emitSkeletons>true</emitSkeletons> </source> </sources> </configuration> </plugin> </plugins> <build> ... </project> |
在src/main下新增一個idl子目錄,而<include>標籤涵蓋的IDL檔則放進src/main/idl目錄下,執行mvn idlj:generate後,會在target/generated-sourced/idl目錄下產出以module為名的子目錄及code generate出來的六個Java檔。Jemmy 發表在 痞客邦 留言(0) 人氣(74)
在Eclipse執行Maven的jetty:run過程,總出現以下這行討厭的訊息: [WARNING] Using platform encoding (MS950 actually) to copy filtered resources, i.e. build is platform dependent! 後來在pom.xml裡的<properties>標籤加以下的設定就OK了。 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
Jemmy 發表在 痞客邦 留言(1) 人氣(641)

參觀了
http://www.javaworld.com.tw/roller/piaoyi/entry/usefuleclipseplugins,下載幾個plugin來玩玩。本來想找Maven在Native2Ascii的支援,沒想到就有現成的plugin,可以做到編輯時看到的是中文,存檔變成Unicode格式,而且還是兩個:
Properties Editor、
JInto。前者可以按右鍵選擇看Unicode內容,後者是採Table式編輯。 稍為符合一定程度的開發,像
Coverage、
Check Style都會有。而我比較在意的是JDepend,日前前老板問過我一事,有無工具可以推導一個Jar的dependency,我印象中沒有,最多從其中最常用的一個找出它在Maven的artifact id。而JDepend似乎就補足這樣的需求,它的Eclipse Plugin的網址是
http://andrei.gmxhome.de/eclipse,安裝後,在package按右鍵,點選[Run JDepend analysis](早一點版本只寫JDepend),就會切換到JDepend Perspective,如下:

JDepend和Coverage工具之一Coberturu一樣,同時也提供了Maven Plugin,只需要在pom.xml做如下的設定,再執行mvn site:site,便可能產出相依性報表(唉!還是無法在M2Eclipse 0.10.0下自訂mvn site:site):
<project> ... <build> ... </build> ... <reporting> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jdepend-maven-plugin</artifactId> </plugin> </plugins> </reporting> ... </project> |
Jemmy 發表在 痞客邦 留言(0) 人氣(201)
| Product artifact | Group ID | Artifact ID |
| Java Activation Framework | javax.activation | activation |
| J2EE | javax.j2ee | j2ee |
| Java Data Object (JDO) | javax.jdo | jdo |
| Java Message Service (JMS) | javax.jms | jms |
| JavaMail | javax.mail | mail |
| Java Persistence API (JPA) / EJB 3 | javax.persistence | persistence-api |
| J2EE Connector Architecture | javax.resource | connector |
| J2EE Connector Architecture API | javax.resource | connector-api |
| Java Authentication and Authorization Service (JAAS) | javax.security | jaas |
| Java Authorization Contract for Containers | javax.security | jacc |
| Servlet API | javax.servlet | servlet-api |
| Servlet JavaServer Pages (JSP) | javax.servlet | jsp-api |
| Servlet JavaServer Pages Standard Tag Library (JSTL) | javax.servlet | jstl |
| JDBC 2.0 Optional Package | javax.sql | jdbc-stdext |
| Java Transaction API (JTA) | javax.transaction | jta |
| Java XML RPC | javax.xml | jaxrpc |
| Portlet | javax.portlet | portlet-api |
| Java Naming and Directory Interface (JNDI) | javax.naming | jndi |
參考自
http://maven.apache.org/guides/mini/guide-coping-with-sun-jars.html。
Jemmy 發表在 痞客邦 留言(0) 人氣(40)