目前分類:JAVA - BASIC (9)

瀏覽方式: 標題列表 簡短摘要

Spring Boot 支援多語系(國際化)的網頁顯示,這在國際化的軟體或公司是必需具備的,要達成這個功能只需要簡單的幾個步驟即可以達到。在 Spring Boot 在 Eclipse 的安裝與設定 最後中,有建議安裝 ResourceBundle Editor 的插件,在此也會用到,不妨先安裝於 Eclipse 中。

  • LocaleResolver

為了讓應用程式能夠確定當前正在使用的語言環境,需要在 class: WebMvcConfig 中添加一個 @Bean(name = "localeResolver") ,記得要設定 name = "localeResolver",不然會出現HTTP Status 500 – Internal Server Error 的錯誤訊息。

  1. /**
  2. * 多語系設定
  3. * @return
  4. */
  5. @Bean(name = "localeResolver")
  6. public LocaleResolver getLocaleResolver() {
  7. CookieLocaleResolver cookieLocaleResolver= new CookieLocaleResolver();
  8. cookieLocaleResolver.setCookieHttpOnly(true);
  9. cookieLocaleResolver.setDefaultLocale(Locale.US);
  10. cookieLocaleResolver.setCookieName("appsLocaleCookie");
  11. cookieLocaleResolver.setCookieMaxAge(60*60);
  12. return cookieLocaleResolver;
  13. }

這裡是使用 CookieLocaleResolver ,所以會在用戶端的電腦建立一個 Cookie 的檔案來存放 appsLocaleCookie 的值,若不想要這麼作,那可以用 SessionLocaleResolver ,如下:

  1. @Bean(name = "localeResolver")
  2. public LocaleResolver localeResolver() {
  3. SessionLocaleResolver slr = new SessionLocaleResolver();
  4. slr.setDefaultLocale(Locale.US);
  5. return slr;
  6. }

 

繼續閱讀:  Spring Boot 多語系設置(國際化)

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

在參考  Spring Boot 在 Eclipse 的安裝與設定 後,我們於文章中 使用 Eclipse 快速建立 Spring Starter Project 建立了一個網站,並且利用 程式版本控制 on GitHub or Gitee or Bitbucket or GitLab 將專案上傳到了 GitLab ,如何回到了家或是在另一台電腦工作環境時,Eclipse 如何將這個專案導入進來呢? 其實它很簡單,依照下面的步驟就可以了。

切換到 git 的 Perspective ,選擇 Clone a Git Repository and add this clone to this view ,輸入在 GitLab 專案的 HTTPS 網址,以及帳號/密碼。若對於帳號/密碼不知是什麼的,請參考 程式版本控制 on GitHub or Gitee or Bitbucket or GitLab 

eclipse-git-clone

 

選擇要匯入進來的 Branch ,因為目前只有一個 master ,所以只能選擇它囉。

eclipse-git-clone

 

選擇要放這個專案的本機目錄,以本例是放在 v:\git\gitlab\apps

eclipse-git-clone

 

將這個專案,匯入到 Eclipse 裡

eclipse-git-clone

 

選擇專案匯入的來源,就是剛剛 git clone 到本機的目錄  v:\git\gitlab\apps

eclipse-git-clone

 

最後不要忘記將這個專案加入 Gradle ,這樣就完成了,執行看看這個專案吧,應該是可以運作正常的。

eclipse-git-clone

MIS 發表在 痞客邦 留言(0) 人氣()

Struts2 的 logger 是與 log4j2 作整合,同樣是 Apache Project 專案之一。為了瞭解一下與架構 Java 專案時的偵錯機制,所以花了半天的時間來實作。

Maven 對 log4j2 相依性

    <properties>
        <struts2.version>2.3.24.1</struts2.version>
        <log4j2.version>2.2</log4j2.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>${log4j2.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>${log4j2.version}</version>
        </dependency>

 

 log4j2.xml (在 src/main/resources 目錄下)

<?xml version="1.0" encoding="UTF-8"?>

<!-- 優先等級: FATAL > ERROR > WARN >INFO > DEBUG -->
<Configuration>
    <properties>  
        <property name="LOG_HOME">/log/mis</property>
        <property name="FILE_NAME">mis</property>    
    </properties>  
    <Appenders>
        <Console name="STDOUT" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
        </Console>
        <File name="FILE" fileName="${LOG_HOME}/logfile_fileMode.log" append="true">
            <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
        </File>
        <RollingRandomAccessFile name="MIS_PROJECT"
            fileName="${LOG_HOME}/${FILE_NAME}.log"
            filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log.gz">
            
            <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n" />
            <Policies>
                <TimeBasedTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="10 MB" />
            </Policies>
            <DefaultRolloverStrategy max="20" />
        </RollingRandomAccessFile>
        
    </Appenders>
    <Loggers>
        <Logger name="com.opensymphony.xwork2" level="info"/>
        <Logger name="org.apache.struts2" level="info"/>
        
        <Logger name="com.mis.demo" level="DEBUG" additivity="true">
            <AppenderRef ref="STDOUT"/>
        </Logger>

        <Root level="info">
            <AppenderRef ref="STDOUT"/>                  
        </Root>      
        <Root level="WARN">
            <AppenderRef ref="MIS_PROJECT" />
        </Root>        
    </Loggers>
</Configuration>

參數說明

1. monitorInterval="1800" 指 log4j2 每隔1800秒(半小時),自動監控該設定檔是否有變化,如果變化,則自動根據檔內容重新配置(很不錯的功能!)

2. RollingRandomAccessFile  即表示以檔方式記錄,注意一下 filePattern 的設置,它與 SizeBasedTriggeringPolicy (表示單個檔最大多少容量)結合在一起,非常有用,以這段配置為例,當單個文件達到10M後,會自動將以前的內容,先創建類似 2014-09(年-月)的目錄,然後按 "xxx-年-月-日-序號"命名,打成壓縮包(很體貼的設計,即省了空間,又不丟失以前的日誌資訊)

3. DefaultRolloverStrategy max="20"表示壓縮包,最多保留20個

4. 定義了一個 <Logger name="com.mis.demo" level="DEBUG" additivity="true"> ,使用 Console 方式來觀察日誌,additivity="true" 這裡注意一下,因為下面還有一個root logger,任何其它的logger最終都相當於繼承自root logger。

所以<Root level="WARN"> 這個 root logger中,記錄了 WARN 以上級別的日誌,會寫入日誌 mis.log 檔案內;當 <Logger name="com.mis.demo" level="DEBUG" additivity="true"> 有 DEBUG 以上級別的日誌時,也會寫入檔案日誌 mis.log 檔案內。。如果把additivity="true" 中的true,改成false,root logger就不會再起作用,即只會控制台輸出,日誌不會記錄在檔案中。

 

程式 Log4j2Example.java

package com.mis.demo;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4j2Example {

    private static final Logger LOG = LogManager.getLogger(Log4j2Example.class.getName());
    public static void main(String[] args) {
        LOG.debug("This will be printed on debug");        
        LOG.info("This will be printed on info");
        LOG.warn("This will be printed on warn");
        LOG.error("This will be printed on error");
        LOG.fatal("This will be printed on fatal");

        LOG.info("Appending string: {}.", "Hello, World");

    }

}

 

 輸出的格式內容

2016-03-11 10:43:52,260 DEBUG [main] demo.Log4j2Example (Log4j2Example.java:9) - This will be printed on debug
2016-03-11 10:43:52,261 INFO  [main] demo.Log4j2Example (Log4j2Example.java:10) - This will be printed on info
2016-03-11 10:43:52,262 WARN  [main] demo.Log4j2Example (Log4j2Example.java:11) - This will be printed on warn
2016-03-11 10:43:52,262 ERROR [main] demo.Log4j2Example (Log4j2Example.java:12) - This will be printed on error
2016-03-11 10:43:52,262 FATAL [main] demo.Log4j2Example (Log4j2Example.java:13) - This will be printed on fatal
2016-03-11 10:43:52,263 INFO  [main] demo.Log4j2Example (Log4j2Example.java:15) - Appending string: Hello, World.

 

 參考:

http://www.cnblogs.com/yjmyzz/p/3988114.html

http://blog.csdn.net/jiangguilong2000/article/details/11397557

http://memorynotfound.com/log4j2-with-log4j2-xml-configuration-example/

https://logging.apache.org/log4j/2.x/manual/configuration.html

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

JSP 的 EL 與 JSF 的 EL( 如 JSF EL ( Expression Language ) 的介紹),大致相同,參考 http://penguin1989930.pixnet.net/blog/post/236537248 ,後整理如下:

 

使用EL存取資料
如果想要顯示application隱含物件中的count變數時,可以使用JSP這樣做:
<%=application.getAttribute("count")%>

而也可以透過EL這樣做:
${count}

${applicationScope.count}

您可以發現EL真的讓JSP的程式碼簡潔了許多。其中applicationScope代表示application隱含物件中的資料集合(並不等於application物件),而EL顯示集合的方法有三種:
${applicationScope.count}
${applicationScope['count']}
${applicationScope["count"]}

1.存取資料的預設物件有:

EL預設物件

對應的JSP隱含物件集合

applicationScope

application集合

sessionScope

session集合

pageScope

page集合

requestScope

request集合

pageContext

pageContext物件

存取資料時,如果沒有指定範圍,會依照pageContext >> request >> session >> application的順序來顯示資料,例如:

<%
session.setAttribute("username","jack");
application.setAttribute("username","mary");
%>

${username}


由於session與application兩者都擁有username變數值,所以EL會依照先後順序來顯示資料(session >> application),所以上述程式便會輸出 jack。
如果想要取得web.xml所設定的初始變數值,可以利用initParam預設物件來完成,請看以下範例:

使用JSP

使用EL

<%=application.getInitParameter("host")%>

${initParam}


2. 利用EL接收網頁傳遞過來的資料 

接收網頁傳遞過來的資訊可使用EL所提供的預設物件

EL預設物件

對應的JSP的方法

param

request.getParameter()

paramValues

request.getParameterValues()


如果要顯示網頁傳遞過來的變數:

使用JSP

使用EL

<%=request.getParamater("username")%>

${param.username}

如果要顯示網頁傳遞過來的變數:(該變數為陣列時)

使用JSP

使用EL

<%

String[] paper = request.getParamaterValues("paper");

out.print("第一個項目:"+paper[0]);

%>

${paramValues.paper[0]}

 

3. 利用EL取得cookie資料

如果使用JSP來取得cookie中的username,可以使用以下程式碼:

Cookie[] ck = request.getCookies();
if (ck != null) {
for (int i = 0; i < ck.length; ++i)
if (ck[i].getName().equals("username")) {
out.print(ck[i].getValue());
break;
}
}

但如果使用EL的預設物件-cookie,就可以簡化成:
${cookie.username.value}

 

4. 利用EL取得網頁標頭資訊

取得標頭用EL所提供的預設物件

EL預設物件

對應的JSP的方法

header

request.getHeader()

headerValues

request.getHeaders()

舉例來說,如果想要取得目前網站主機名稱,可以使用以下方法:

使用JSP

使用EL

<%=request.getHeader("host")%>

${header.host}

<%=request.getContextPath() %>

${request.contextPath}

運用如下:

<a href="${request.contextPath}/Home" >Home</a>

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

Java 要對 Windows Server AD (Active Directory) 的認證整合,程式碼如下:

 

Step 01: 準備一個共用函數 LDAP_AUTH_AD

    /**
     * AD LDAP 登入認證
     *
     * @param ldap_url
     *            like ldap://912.168.2.1:389/DC=WEI,DC=COM
     * @param account
     * @param password
     * @return String[2] array 0 :0 success,1 fail,2 LDAP connect fail,3 unknow
     *         error array 1 :useremail
     */
    public String[] LDAP_AUTH_AD(String ldap_url, String account, String password) {
        String[] returnStr = new String[2];
        Hashtable<String, String> env = new Hashtable<String, String>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, ldap_url);
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, account);
        env.put(Context.SECURITY_CREDENTIALS, password);

        LdapContext ctx = null;
        try {
            ctx = new InitialLdapContext(env, null);
            returnStr[0] = "0";

            SearchControls searchCtls = new SearchControls();
            searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
            String searchFilter = "(sAMAccountName=" + account + ")";

            String searchBase = "";
            int totalResults = 0;

            String returnedAtts[] = { "mail" };
            searchCtls.setReturningAttributes(returnedAtts);
            try {
                NamingEnumeration answer = ctx.search(searchBase, searchFilter, searchCtls);

                while (answer.hasMoreElements()) {
                    SearchResult sr = (SearchResult) answer.next();
                    Attributes Attrs = sr.getAttributes();
                    if (Attrs != null) {
                        try {
                            for (NamingEnumeration ne = Attrs.getAll(); ne.hasMore();) {
                                Attribute Attr = (Attribute) ne.next();
                                for (NamingEnumeration e = Attr.getAll(); e.hasMore(); totalResults++) {
                                    returnStr[1] = e.next().toString();
                                }

                            }
                        } catch (NamingException e) {
                            System.err.println("Throw Exception : " + e);
                        }
                    }
                }
                loger.debug("Number: " + totalResults);
            } catch (Exception e) {
                loger.error("Can't find Email Address");
            }

            return returnStr;
        } catch (javax.naming.AuthenticationException e) {
            returnStr[0] = "1";
            e.printStackTrace();
            return returnStr;
        } catch (javax.naming.CommunicationException e) {
            // System.out.println("Can't connect to ldap server!");
            returnStr[0] = "2";

            return returnStr;
        } catch (Exception e) {
            System.out.println("error");
            e.printStackTrace();
            returnStr[0] = "3";

            return returnStr;
        } finally {
            if (ctx != null) {
                try {
                    ctx.close();
                } catch (NamingException e) {

                }
            }
        }
    }

 

Step 02: 主程式

// 取得認證URL
String LDAP_URL="ldap://192.168.2.1:389/DC=WEI,DC=COM;WEI.COM";
LDAP_URL = LDAP_URL.split(";")[0];;
// 取得該公司網域
String AD_Domain="";
AD_Domain = "@"+LDAP_URL.split(";")[1].trim();

// AD認證方式登入
if(AUTH_METHOD.equalsIgnoreCase("AD") && !isLogin) {
    String[] as = baTools.LDAP_AUTH_AD(LDAP_URL, users.getUserName()+AD_Domain, users.getUserPassword());
    if (as[0].equals("0")) {
        isLogin = true;
        loginResult= SUCCESS;

    }else{
        this.addActionError("帳號登入錯誤");
    }
} // end AD認證方式登入

 

這樣就可以與您的公司的 AD (Active Directory) LDAP認證主機作整合.

程式碼:Java 對於LDAP: Windows Server AD (Active Directory) 的認證整合
http://misforum.ddns.net/forum.php?mod=viewthread&tid=20&fromuid=2
(出處: MISForum 資訊論壇)

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

JSF Expression Language 搭配 JSF 標籤來使用,是用來存取資料物件的一個簡易語言。JSF EL是以#開始,將變數或運算式放置在 { 與 } 之間,例如:#{someBeanName}


變數名稱可以是faces-config.xml中定義的名稱,如果是Bean的話,可以透過使用 '.' 運算子來存取它的屬性,例如:

...
<f:view>
          <h:outputText value="#{userBean.name}"/>
</f:view>
...

 

在JSF標籤的屬性上," 與 " (或'與')之間如果含有EL,則會加以運算,您也可以這麼使用它:

...
<f:view>
            名稱, 年齡:<h:outputText value="#{userBean.name}, #{userBean.age}"/>
</f:view>
...

一個執行的結果可能是這樣顯示的: 名稱, 年齡:Justin, 29

 

EL的變數名也可以程式執行過程中所宣告的名稱,或是JSF EL預設的隱含物件,例如下面的程式使用param隱含物件來取得使用者輸入的參數:

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@page contentType="text/html; charset=utf-8"%>
    
<html>
    <head>
        <title></title>
    </head>
    <body>
        <f:view>
                  <b> 您好, <h:outputText value="#{param.name}"/> </b>
        </f:view>
    </body>
</html>

 

param是JSF EL預設的隱含物件變數,它代表request所有參數的集合,實際是一個java.util.Map型態物件,JSF所提供的隱含物件,大致上對應於 JSP 隱含物件,不過JSF隱含物件移除了pageScope與pageContext,而增加了facesContext與view,它們分別對應於 javax.faces.context.FacesContext與javax.faces.component.UIViewRoot。
對於Map型態物件,我們可以使用 '.' 運算子指定key值來取出對應的value,也可以使用 [ 與 ] 來指定,例如:

...
<f:view>
          <b> 您好, <h:outputText value="#{param['name']}"/> </b>
</f:view>
...
 

在 [ 與 ] 之間,也可以放置其它的變數值,例如:


...
 <f:view>
            <h:outputText value="#{someBean.someMap[user.name]}"/>
 </f:view>
...

 

如果變數是List型態或陣列的話,則可以在 [] 中指定索引,例如:

....
<f:view>
           <h:outputText value="#{someBean.someList[0]}"/>
           <h:outputText value="#{someBean.someArray[1]}"/>
           <h:outputText value="#{someBean.someListOrArray[user.age]}"/>  
</f:view>
....

 

您也可以指定字面常數,對於true、false、字串、數字,JSF EL會嘗試進行轉換,例如:

....
<h:outputText value="#{true}"/>
....
<h:outputText value="#{'This is a test'}"/>
....

 

如果要輸出字串,必須以單引號 ' 或雙引數 " 括住,如此才不會被認為是變數名稱。在宣告變數名稱時,要留意不可與JSF的保留字或關鍵字同名,例如不可取以下這些名稱:
 true false null div mod and or not eq ne lt gt le ge instanceof empty

 

使用EL,您可以直接實行一些算術運算、邏輯運算與關係運算,其使用就如同在一般常見的程式語言中之運算。

算術運算子有:加法 (+), 減法 (-), 乘法 (*), 除法 (/ or div) 與餘除 (% or mod) 。下面是算術運算的一些例子:

運算式

結果

#{1}

1

#{1 + 2}

3

#{1.2 + 2.3}

3.5

#{1.2E4 + 1.4}

12001.4

#{-4 - 2}

-6

#{21 * 2}

42

#{3/4}

0.75

#{3 div 4}

0.75,除法

#{3/0}

Infinity

#{10%4}

2

#{10 mod 4}

2,也是餘除

#{(1==2) ? 3 : 4}

4

 

如同在Java語法一樣 ( expression ? result1 : result2)是個三元運算,expression為true顯示result1,false顯示result2。

邏輯運算有:and(或&&)、or(或!!)、not(或!)。一些例子為:

運算式

結果

#{true and false}

false

#{true or false}

true

#{not true}

false

 

關係運算有:小於Less-than (< or lt)、大於Greater-than (> or gt)、小於或等於Less-than-or-equal (<= or le)、大於或等於Greater-than-or-equal (>= or ge)、等於Equal (== or eq)、不等於Not Equal (!= or ne),由英文名稱可以得到lt、gt等運算子之縮寫詞,以下是Tomcat的一些例子:

運算式

結果

#{1 < 2}

true

#{1 lt 2}

true

#{1 > (4/2)}

false

#{1 > (4/2)}

false

#{4.0 >= 3}

true

#{4.0 ge 3}

true

#{4 <= 3}

false

#{4 le 3}

false

#{100.0 == 100}

true

#{100.0 eq 100}

true

#{(10*10) != 100}

false

#{(10*10) ne 100}

false

 

 

左邊是運算子的使用方式,右邊的是運算結果,關係運算也可以用來比較字元或字串,按字典順序來決定比較結果,例如:

運算式

結果

#{'a' < 'b'}

true

#{'hip' > 'hit'}

false

#{'4' > 3}

true

 

EL運算子的執行優先順序與Java運算子對應,如果有疑慮的話,也可以使用括號()來自行決定先後順序。

 

資料來源:http://openhome.cc/Gossip/JSF/JSFExpressionLanguage.htm

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

Maven 基本概念:

Maven 是類似 ANT 的 Java 佈署工具,MavenANT 方便的地方是,Maven 會自動去下載專案中必要的 jar 檔。Maven 的 Archetype 主要是會先配置好相關不同專案類型的開發環境,有點類似 template 。

首先到官方網址下載 apache-maven-3.1.1-bin.zip 檔案,並解壓於 C:\AppServ\apache-maven-3.1.1 ( M2_HOME )目錄下。因為我的 Java JDK 是 1.6.0_07 版本,並且放在 D:\Progs\jdk1.6.0_07 目錄下。所以要修改 C:\AppServ\apache-maven-3.1.1\bin\mvn.bat ,增加 JAVA_HOME 的設定如下:

@REM ----------------------------------------------------------------------------
@REM Maven2 Start Up Batch script
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM M2_HOME - location of maven2's installed home dir
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM     e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------

set JAVA_HOME="D:\Progs\jdk1.6.0_07"

 

剛提到 Maven 會自動下載專案相關的套件 JAR 檔,Windows 環境中,這就是所謂的 repository 指的是 Maven 存放套件資源的地方.若我們本機(local)電腦中沒有這些套件,Maven會自動從預設的網路位置 下載放到我們本機的repository 中,之後所有Maven專案需要用到的套件,Maven 都會先找本機的 repository,找不到再到網路上去 找;預設存放的目錄是在 ${user.home}/.m2/repository ,若要變更則是修改 %M2_HOME%\conf\settings.xml 檔案中的 <localRepository>...</localRepository>,如:<localRepository>D:/Progs/.m2/repository</localRepository>

確認一下 安裝可以正常執行

C:\AppServ\apache-maven-3.1.1\bin>mvn -ver

C:\AppServ\apache-maven-3.1.1\bin>set JAVA_HOME="D:\Progs\jdk1.6.0_07"

Apache Maven 3.1.1 (0728685237757ffbf44136acec0402957f723d9a; 2013-09-17 23:22:2
2+0800)
Maven home: C:\AppServ\apache-maven-3.1.1\bin\..
Java version: 1.6.0_07, vendor: Sun Microsystems Inc.
Java home: D:\Progs\jdk1.6.0_07\jre
Default locale: zh_TW, platform encoding: MS950
OS name: "windows vista", version: "6.2", arch: "x86", family: "windows"

 

eclipse 專案實作:

Step 01:設定 Maven 在 eclipse 的環境

 maven_eclipse_preference.png  

也是可以利用 Eclipse Markplace 中去下載,與 eclipse 整合;若是整合 (Embedded) 在一起的話,那 eclipse 在 New 一個專案時,就可以看到 Maven 的選項

Maven_Project  

Step 02:建立一個 Archetype:maven-archetype-quickstart 的專案

把專案程式放在 D:\my_workspace\myMaven 目錄下

myMaven_place

 

選擇 Maven Project 預設的 Archetype:maven-archetype-quickstart

maven-archetype-quickstart

  預設將 java 的程式放在 package: com.demo 下

 myMaven_package  

整個結構就會像下圖:

myMaven_Structure  

 

手動執行看看

D:\my_workspace\myMaven>mvn exec:java -Dexec.mainClass=com.demo.App

D:\gu_workspace\myMaven\myMaven>set JAVA_HOME="D:\Progs\jdk1.6.0_07"

[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building myMaven 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> exec-maven-plugin:1.2.1:java (default-cli) @ myMaven >>>
[INFO]
[INFO] <<< exec-maven-plugin:1.2.1:java (default-cli) @ myMaven <<<
[INFO]
[INFO] --- exec-maven-plugin:1.2.1:java (default-cli) @ myMaven ---
Hello World!
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.535s
[INFO] Finished at: Tue Nov 12 11:48:04 CST 2013
[INFO] Final Memory: 4M/9M
[INFO] ------------------------------------------------------------------------
D:\my_workspace\myMaven>

 

Step 03: Build JAR 檔

將要 build JAR 檔的目的位置(Goals)設為 package

maven_goals  

再針對 pom.xml  作 Maven build , 就會在 target 目錄下得到:myMaven-0.0.1-SNAPSHOT.jar
  

mvn_build  

 

參考:

http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

文章標籤

MIS 發表在 痞客邦 留言(0) 人氣()

來源: Polin Wei

  上一篇 ANT 的基本介紹 我們知道透過 ANT 可以幫我們 Compile Java 所建立的專案,而且可以順便建立 JBoss 所需要的 .war 檔.但是 build.xml 的撰寫卻是一項艱鉅的任務,那有什麼工具可以代勞呢?! 接下來就來介紹如何用 Eclipse 自動建立 ANT 需要的 build.xml

環境:

Java : jdk1.5.0_12 程式放在 D:\Progs\jdk1.5.0_12
Eclipse: Ganymede http://www.eclipse.org/downloads/JBoss: Jboss-4.0.3SP1

  在專案上按滑鼠右鍵,選擇 Export

  

  然後選擇 General -> Ant Buildfiles





 最後選擇你要建立那一個專案的 build.xml ,按下 Finish 即可。



  這樣子就可以自動產生這個專案 Ant 所需要的 build.xml ,當然這個檔案是需要作些許修改的,至於 Ant 的屬性及要修改那些地方,可以視你自己的需要,詳細的說明可以參考
ANT 的基本概念與實作

參考:

[教學] 利用Eclipse 自動建立ANT 需要的build.xml

MIS 發表在 痞客邦 留言(0) 人氣()

來源: Polin Wei

Ant 的全名是"Another Neat Tool",Ant主要可以幫您自動完成下列的任務:

  • 編譯Java原始碼
  • 建立jar、war、zip檔案
  • 自動測試與生成報告
  • 從 CVS 或 SVN 等管理系統取得原始碼

所以若你對 Java 程式沒有任何興趣的話,那就可以先離開了,不然會很無聊.

環境:
OS: WinXPSP2

程式版本:
Java : jdk1.5.0_12 程式放在 D:\Progs\jdk1.5.0_12
Ant: ant-1.7.0 程式放在 C:\AppServ\apache-ant-1.7.0

增加系統變數:
%JAVA_HOME% = D:\Progs\jdk1.5.0_12
%ANT_HOME% = C:\AppServ\apache-ant-1.7.0

增加路徑:
PATH=%ANT_HOME%\bin;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

以上的環境設定好後,可以在 Command Prompt 中來測試一下 Ant 是否正常運作.




project 節點:

project 節點是 build.xml 的文件根節點。一個文件之中,只能有一個根節點。project 節點有以下三個屬性。

name:(必要:No)
專案名稱

default:(必要:Yes)
假設命令列未指定 target 時,預設執行的 target 節點

basedir:(必要:No)
用來指定專案的根目錄,這個屬性可以使用"basedir" property 節點來改變,如果定義 basedir的 property 節點,在 project 標籤中,就不可以定義這個屬性。假使未使用這個屬性或 property 節點來定義 basedir的話,則 Ant 會使用這個專案 build.xml 的目錄,作為 basedir。

屬性 說明 是否必要
name 專案名稱 No
default 假設命令列未指定 target 時,預設執行的 target 節點 Yes.
basedir 用來指定專案的根目錄,這個屬性可以使用"basedir" property 節點來改變,如果定義 basedir的 property 節點,在 project 標籤中,就不可以定義這個屬性。假使未使用這個屬性或 property 節點來定義 basedir的話,則 Ant 會使用這個專案 build.xml 的目錄,作為 basedir。 No

 



target 節點:

  target 節點是 Ant 執行的目標,我們可以把各種命令(在 Ant 中的術語,叫任務 task),放在 target 的節點中。所以,你可以把他想成是一組命令的結合,以程式設計來說,接近副程式或不傳回值的函式。

  target 和 target 之間,可以使用 depends屬性來定義彼此間的依存關係。藉由定義這些依存的關係,我們可以改變 target 的執行順序。也可以定義 if 以及 unless 屬性,來決定是否執行這個 target 節點的工作。沒有定義 if 和 unless 屬性的 target 節點,一定會按照順序執行。


name:target 的名稱

depends:
在執行這個 target 節點之前,先要執行其他節點的名稱。如果是多個節點時,以逗號區隔各個節點。


if:
指定 property 名稱。必須定義這個 property ,才會執行這個 target的工作。


unless:
指定 property 名稱。必須不定義這個 property ,才會執行這個 target的工作。


description:
文字說明

屬性 說明 是否必要
name target 的名稱 Yes
depends 在執行這個 target 節點之前,先要執行其他節點的名稱。如果是多個節點時,以逗號區隔各個節點。 No
if 指定 property 名稱。必須定義這個 property ,才會執行這個 target的工作。 No
unless 指定 property 名稱。必須不定義這個 property ,才會執行這個 target的工作。 No
description 文字說明 No

 



task 節點:

  task 節點,是 Ant 執行工作最基本的單位,類似程式設計中的命令句。可分為 core tasks 和 optional tasks 兩類,你也可以使用 java 來撰寫自定的 task。

 task 的範圍很廣,各個屬性也不相同,要運用 task時,可參考 Ant 的線上說明。



property 節點:

  property 節點,定義專案的屬性值,類似程式設計中的變數。最常用的屬性有 name 和 value。name 定義這個 property 的名稱,value 定義這個property 的值。要讀取 property 的值時,必須使用 ${property名稱}的格式。


  
  整理一下:在 Ant 的 buildfile 中可以定義構建專案時的「屬性」(property)、「任務」(task),一個build.xml中可以定義多個任務,這些任務可能是建立目錄、編譯Java原始碼、搬移檔案、產生doc文件、進行測試、產生測試報告等等,這些任務通常組織為一個「目標」(target)。



現在我們就來建立一個實際的專案及一個簡單的 build.xml 檔作測試

專案名:test (這是一個 struts 架構)
JBoss: jboss-4.0.3SP1

專案架構如下圖:







build.xml 檔案內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project basedir="." default="build" name="test">
<property environment="env"/>
<property name="ECLIPSE_HOME" value="../../Progs/eclipse-ganymede"/>
<property name="JBOSS_HOME" value="C:/AppServ/jboss-4.0.3SP1" />
<property name="server.publish.dir" value="${JBOSS_HOME}/server/default/deploy/" />=> 定義 JBoss 存放專案的地方

<property name="debuglevel" value="source,lines,vars"/>
<property name="target" value="1.5"/>
<property name="source" value="1.5"/>
<path id="JBoss v4.0 [JBoss v4.0].libraryclasspath"> => 這個專案所需要的 JAR 檔
    <pathelement location="${JBOSS_HOME}/client/jboss-j2ee.jar" />
    <pathelement location="${JBOSS_HOME}/client/jbossall-client.jar" />
    <pathelement location="${JBOSS_HOME}/server/default/lib/javax.servlet.jar" />
    <pathelement location="${JBOSS_HOME}/server/default/lib/javax.servlet.jsp.jar" />
    <pathelement location="${JBOSS_HOME}/server/default/lib/activation.jar" />
    <pathelement location="${JBOSS_HOME}/server/default/lib/mail.jar" />
</path>

<path id="Web App Libraries.libraryclasspath">=>在 WebContent 中要包含的 JAR 檔
    <pathelement location="WebContent/WEB-INF/lib/NCSO.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/activation.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/common-annotations.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/commons-beanutils-bean-collections.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/commons-beanutils.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/commons-collections-3.1.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/commons-dbcp-1.2.2.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/commons-digester-1.7.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/commons-digester.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/commons-fileupload.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/commons-io-1.3.1.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/commons-javaflow-20060411.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/commons-lang.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/commons-logging-api.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/commons-logging.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/commons-pool-1.2.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/commons-validator.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/itext-1.3.1.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/jakarta-oro.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/jasperreports-1.3.4.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/jdbc2_0-stdext.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/jstl.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/jxl.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/log4j-1.2.11.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/mail.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/ocrs12.zip"/>
    <pathelement location="WebContent/WEB-INF/lib/ojdbc14.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/ojdbc14_g.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/p6spy.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/png-encoder-1.5.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/poi-3.0.1-FINAL-20070705.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/quartz-1.5.2.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/standard.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/struts-legacy.jar"/>
    <pathelement location="WebContent/WEB-INF/lib/struts.jar"/>
</path>
<path id="EAR Libraries.libraryclasspath"/>

<path id="test.classpath"> => 這是重點, 此專案中所有 Java compile 成 class 檔 , 只要deploy Class 檔即可
    <pathelement location="WebContent/WEB-INF/classes"/>
    <path refid="JBoss v4.0 [JBoss v4.0].libraryclasspath"/>
    <path refid="Web App Libraries.libraryclasspath"/>
    <path refid="EAR Libraries.libraryclasspath"/>
</path>

<target name="init"> => ANT Compile 的進入點
    <mkdir dir="WebContent/WEB-INF/classes"/>
    <copy includeemptydirs="false" todir="WebContent/WEB-INF/classes">
        <fileset dir="src" excludes="**/*.launch, **/*.java"/>
    </copy>
</target>

<target name="clean"> => ANT compile 完後, 將 class 檔刪除
    <delete dir="WebContent/WEB-INF/classes"/>
</target>

<target depends="clean" name="cleanall"/>
<target depends="build-subprojects,build-project" name="build"/>
<target name="build-subprojects"/>

<target depends="init" name="build-project"> => 開始建立整個專案
    <echo message="${ant.project.name}: ${ant.file}"/>
    <javac deprecation="no" nowarn="true" encoding="UTF-8" debug="true" debuglevel="${debuglevel}" destdir="WebContent/WEB-INF/classes" source="${source}" target="${target}">
    <src path="src"/>
    <classpath refid="test.classpath"/>
</javac>

<jar destfile="${ant.project.name}.war"> => 把整個專案包成一個 .war 檔
    <zipfileset dir="WebContent/">
        <include name="**/*.*" />
        <exclude name="**/*.war" />
    </zipfileset>
</jar>

<move file="${ant.project.name}.war" todir="${server.publish.dir}" /> => 將 .war 檔 copy 到 JBoss 的目錄 "C:/AppServ/jboss-4.0.3SP1/server/default/deploy/"

</target>

<target description="Build all projects which reference this project. Useful to propagate changes." name="build-refprojects"/>
<target description="copy Eclipse compiler jars to ant lib directory" name="init-eclipse-compiler">
<copy todir="${ant.library.dir}">
<fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/>
</copy>
<unzip dest="${ant.library.dir}">
<patternset includes="jdtCompilerAdapter.jar"/>
<fileset dir="${ECLIPSE_HOME}/plugins" includes="org.eclipse.jdt.core_*.jar"/>
</unzip>
</target>
<target description="compile project with Eclipse compiler" name="build-eclipse-compiler">

<property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>

<antcall target="build"/>
</target>
</project>

然後再用 ANT 執行, 如下圖



參考文獻:

我與小崴崴的工作日記: [教學] ANT 的基本介紹

Ant 使用手冊:
http://ant.apache.org/manual/index.html





文章標籤

MIS 發表在 痞客邦 留言(1) 人氣()