在上一篇已經成功使用 Maven 製作出一個 Hello World 程式出來,但仍然未能體驗到 Maven 有什麼好處。在這一編文章,程式需要用到 Spring Framework,Spring 的依賴程式庫就交由 Maven 去管理,令各位可以體驗到 Maven 強大之處。
使用上一編文章的 Project 再去進行 Maven 練習,打開 pom.xml,然後選擇 Dependenices 標籤,按下 Add 然後輸入 org.spring 找到一大堆 Spring Framework 的程式庫:
總共要加入 3 個程式庫,分別是 spring-context, spring-beans 和 spring-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
下一編再說。
相關書籍: