Fork me on GitHub

Programming Design Notes

Eclipse + Maven 2 開發 Java SE 專案 - 2

| Comments

上一編: Eclipse + Maven 2 開發 Java SE 專案 - 1

在上一篇已經成功使用 Maven 製作出一個 Hello World 程式出來,但仍然未能體驗到 Maven 有什麼好處。在這一編文章,程式需要用到 Spring FrameworkSpring 的依賴程式庫就交由 Maven 去管理,令各位可以體驗到 Maven 強大之處。

使用上一編文章的 Project 再去進行 Maven 練習,打開 pom.xml,然後選擇 Dependenices 標籤,按下 Add 然後輸入 org.spring 找到一大堆 Spring Framework 的程式庫:


總共要加入 3 個程式庫,分別是 spring-context, spring-beansspring-core,如下圖所示:


儲存 pom.xml,然後發現 Console 顯示下載所需的程式庫,等到下載完成後,打開 Maven Dependenices 發現不是 3 個程式庫,而是有 9 個程式庫,分別是 spring-context, spring-aop, aopilliance, spring-asm, spring-beans, sprng-core, commons-logging, spring-expression。原來那 3 個 Spring 程式庫要依賴另外那 6 個程式庫,而這些程式庫已經由 Maven 管理好,我們根本不需要去理會那些依賴程式庫,只要知道自己的程式需要用什麼程式庫就可以了,實在非常方便。

現在製作一個 HelloWorldBean.java:
package com.ctlok.pro.tutorial.maven.javase.bean;

public class HelloWorldBean {

public String getHelloWorld(){
return "Hello World";
}

}

再到 src/main/resources 加入一個 beans.xml 檔案:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<bean id="helloWorldBean"
class="com.ctlok.pro.tutorial.maven.javase.bean.HelloWorldBean" />

</beans>

現在修改 Main.java 為以下內容:
package com.ctlok.pro.tutorial.maven.javase;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.ctlok.pro.tutorial.maven.javase.bean.HelloWorldBean;

public class Main {

public static void main(String[] args) {

ApplicationContext ctx = new ClassPathXmlApplicationContext(
new String[] { "beans.xml" });
HelloWorldBean bean = (HelloWorldBean) ctx
.getBean(HelloWorldBean.class);
System.out.println(bean.getHelloWorld());

}

}

程式方面已經製作完成,現在需要打包成 Runnable JAR 檔案,但因為這個程式依賴了 9 個程式庫,我們需要將自己的 Class 檔案連同程式庫一起打包到同一個 JAR 內才可以執行到。打包部份可使用 Maven Plugin 去幫助我們連同程式庫一起打包到同一個 JAR 內。

打開 pom.xml 到 並按下 Plugins 標籤,按下 Add 然後輸入 maven-dependency-plugin,加入這個 Plugin,現在 pom.xml 內一共有 2 個 Plugin,一個是 maven-dependency-plugin,另一個是 maven-jar-plugin

現在去設定 maven-dependency-plugin,按下 pom.xml 標籤,將 maven-dependency-plugin 改為以下內容:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<id>ud</id>
<phase>prepare-package</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
</execution>
</executions>
<configuration>
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
</configuration>
</plugin>

execution 內的 phase 是設定何時執行這個 Plugin,我設定為準備打包前。
goals 則可以設定這個 Plugin 執行時會使用的方法,可設定多於一種方法。我設定為將程式庫的 JAR 拆解開。

configuration 內的 outputDirectory 是設定將這些程式庫複製到那一個資料夾內。

完整的 pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ctlok.pro.tutorial.maven.javase</groupId>
<artifactId>javase</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>Maven Tutorial</name>
<description>Maven Tutorial</description>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<archive>
<manifest>
<mainClass>com.ctlok.pro.tutorial.maven.javase.Main</mainClass>
<packageName>com.ctlok.pro.tutorial.maven.javase</packageName>
<addClasspath>false</addClasspath>
</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>
<version>2.1</version>
<executions>
<execution>
<id>ud</id>
<phase>prepare-package</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
</execution>
</executions>
<configuration>
<outputDirectory>${project.build.outputDirectory}</outputDirectory>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.0.4.RELEASE</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>3.0.4.RELEASE</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.0.4.RELEASE</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

現在執行 Run as -> Maven package,完成後發現 target 出現一個 javase-1.0.0-SNAPSHOT.jar,使用指令去執行程式:

C:\>java -jar javase-1.0.0-SNAPSHOT.jar

出現以下訊息即代表成功:
Sep 17, 2010 4:50:02 PM org.springframework.context.support.AbstractApplicationC
ontext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationCont
ext@758fc9: startup date [Fri Sep 17 16:50:02 CST 2010]; root of context hierarc
hy
Sep 17, 2010 4:50:02 PM org.springframework.beans.factory.xml.XmlBeanDefinitionR
eader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [beans.xml]
Sep 17, 2010 4:50:04 PM org.springframework.beans.factory.support.DefaultListabl
eBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.
DefaultListableBeanFactory@bfc8e0: defining beans [helloWorldBean]; root of fact
ory hierarchy
Hello World

下一編再說。

相關書籍: Power & Distance II: Advanced Techniques and Drills for the Perfect SwingMaven: A Developer's Notebook (Developer's Notebooks)Maven: The Definitive Guide