天天看點

eclipse的正确使用方式

前情提要:

Eclipse版本:

Eclipse Java EE IDE for Web Developers.

Version: Mars.1 Release (4.5.1).

Build id: 20150924-1200

自定義new菜單選項

有時候預設的new選項裡面可能沒有class,package等等選項,就像下面這樣:

eclipse的正确使用方式

如果要建立一個class,隻能去點最下面的

Other

再去選擇class。那麼怎樣自定義這個菜單選項呢?看圖說話:

點選菜單

window

–>

perspective

–>

customize perspective...

eclipse的正确使用方式

點選

shortcuts

–>勾選

java

eclipse的正确使用方式

讓我們再來看看效果

eclipse的正确使用方式

The End!

自定義class模闆

先看下面這個類

package com.dimon.xcrm.controller;

import org.apache.log4j.Logger;

/**
 * 一句話說明類的作用
 * @author Dimon
 * @createDate 2015年10月18日 下午7:38:15
 */
public class MainController {
    private static Logger logger = Logger.getLogger(MainController.class);

}
           

每次建立一個類後,都需要給添加這樣一行代碼,以啟用日志功能:

private static Logger logger = Logger.getLogger(MainController.class);

每次new 一個class,都需要在裡面添加一行這樣的代碼,所不同的隻是參數裡面的值不一樣,作為一隻高逼格的碼農,任何重複的體力勞動都是我們所不恥的!那麼正确的姿勢應該是怎樣呢?繼續往下看。

  • 首先,在eclipse中,window–>properties–>搜尋templates
    eclipse的正确使用方式
  • 在class的body中要添加的代碼。
    eclipse的正确使用方式
  • 加上log4j的依賴包。
    eclipse的正确使用方式
  • 下面是類的自動注釋模闆。
    eclipse的正确使用方式
  • 最後,别忘了勾選這個表示使用自動模闆。
    eclipse的正确使用方式
  • 如果需要讓團隊成員保持代碼模闆一緻性,我們可以

    Export All...

    導出配置檔案,給團隊所有人導入模闆,免得每個人都要去手動配置啦。下面是我在上面配置完成後導出來的配置檔案,别說我不照顧伸手黨→_→
<?xml version="1.0" encoding="utf-8"?>

<templates>
  <template autoinsert="true" context="gettercomment_context" deleted="false" description="Comment for getter method" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name="gettercomment">/** * @return the ${bare_field_name} */</template>
  <template autoinsert="true" context="settercomment_context" deleted="false" description="Comment for setter method" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.settercomment" name="settercomment">/** * @param ${param} the ${bare_field_name} to set */</template>
  <template autoinsert="true" context="constructorcomment_context" deleted="false" description="Comment for created constructors" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name="constructorcomment">/** * ${tags} */</template>
  <template autoinsert="false" context="filecomment_context" deleted="false" description="Comment for created Java files" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.filecomment" name="filecomment"/>
  <template autoinsert="false" context="typecomment_context" deleted="false" description="Comment for created types" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.typecomment" name="typecomment">/** * 一句話說明類的作用 * @author ${user} * @createDate ${date} ${time} * ${tags} */</template>
  <template autoinsert="true" context="fieldcomment_context" deleted="false" description="Comment for fields" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name="fieldcomment">/** * */</template>
  <template autoinsert="true" context="methodcomment_context" deleted="false" description="Comment for non-overriding methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name="methodcomment">/** * ${tags} */</template>
  <template autoinsert="true" context="overridecomment_context" deleted="false" description="Comment for overriding methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name="overridecomment">/* (non-Javadoc) * ${see_to_overridden} */</template>
  <template autoinsert="true" context="delegatecomment_context" deleted="false" description="Comment for delegate methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name="delegatecomment">/** * ${tags} * ${see_to_target} */</template>
  <template autoinsert="false" context="newtype_context" deleted="false" description="Newly created files" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.newtype" name="newtype">${filecomment} ${package_declaration} import org.apache.log4j.Logger; ${typecomment} ${type_declaration}</template>
  <template autoinsert="false" context="classbody_context" deleted="false" description="Code in new class type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.classbody" name="classbody">private static Logger logger=Logger.getLogger(${type_name}.class);</template>
  <template autoinsert="true" context="interfacebody_context" deleted="false" description="Code in new interface type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name="interfacebody"></template>
  <template autoinsert="true" context="enumbody_context" deleted="false" description="Code in new enum type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.enumbody" name="enumbody"></template>
  <template autoinsert="true" context="annotationbody_context" deleted="false" description="Code in new annotation type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name="annotationbody"></template>
  <template autoinsert="true" context="catchblock_context" deleted="false" description="Code in new catch blocks" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.catchblock" name="catchblock">// ${todo} Auto-generated catch block ${exception_var}.printStackTrace();</template>
  <template autoinsert="true" context="methodbody_context" deleted="false" description="Code in created method stubs" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.methodbody" name="methodbody">// ${todo} Auto-generated method stub ${body_statement}</template>
  <template autoinsert="true" context="constructorbody_context" deleted="false" description="Code in created constructor stubs" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name="constructorbody">${body_statement} // ${todo} Auto-generated constructor stub</template>
  <template autoinsert="true" context="getterbody_context" deleted="false" description="Code in created getters" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.getterbody" name="getterbody">return ${field};</template>
  <template autoinsert="true" context="setterbody_context" deleted="false" description="Code in created setters" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.setterbody" name="setterbody">${field} = ${param};</template>
</templates>
           

那麼現在來舉一反三,

templates

是什麼呢?百度翻譯告訴我們,它的中文意思就是

模闆

,上面那張圖你們也看到了,搜尋templates,發現出來很多結果,有JAVA的,JSP的,HTML的,CSS的等等,自己去發現吧。我比較常用的還有自定義JSP模闆,在這篇文章中也有個例子–>傳送門

  • 拓展閱讀:在使用eclipse時,我們會發現,如果我們需要coding這樣一行代碼:
System.out.println();
           

我們并不需要把它全部敲出來,一般直接輸入

sysout

,或者

syso

然後按

Alt+/

就會自動給我們補全了,eclipse是這麼做到的呢?還是templates,我們還是看圖說話吧。。。

eclipse的正确使用方式

- 可以看到在裡面找到了我們常用的

syso

了,下面我們也來自定義一個模闆,就是上面new class自動生成的log4j的代碼模闆,我們還可以像下面這樣去做:

eclipse的正确使用方式

import

這裡還可以同時引入多個包,比如我把log4j改成使用slf4j,可以寫成下面這個樣子:

${:import (org.slf4j.Logger,org.slf4j.LoggerFactory)}
/**
 * logging mechanism.
 */
private static Logger logger = LoggerFactory.getLogger(${enclosing_type}.class);
           

就是在小括号裡面使用

","

号分隔開就好了,很簡單。

下面是我導出的這個自定義的模闆,又一伸手黨福利→_→

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

<templates>
  <template autoinsert="true" context="java" deleted="false" description="自動引入log4j代碼" enabled="true" name="autolog">${:import (org.apache.log4j.Logger)} /** * logging mechanism. */ private static Logger logger = Logger.getLogger(${enclosing_type}.class);</template>
</templates>
           
  • 來驗證下效果:
    eclipse的正确使用方式

slf4j的正确使用方式

上面說到了log4j,既然說到這個點,索性在多說一點,精益求精才是高逼格程式猿應有的态度。其實一般我在項目中記錄日志不會像上面這樣直接使用log4j的,而是使用的slf4j。為什麼?簡~而~言~之~呢就是~:SLF4J(Simple logging Facade for Java)不是一個真正的日志實作,而是一個抽象層( abstraction layer),它允許你在背景使用任意一個日志類庫。如果是在編寫供内外部都可以使用的API或者通用類庫,那麼你真不會希望使用你類庫的用戶端必須使用你選擇的日志類庫。巴拉巴拉。。。此處省略一萬字。。。總~而~言之!就是slf4j個日志接口,log4j可以看成是它的實作類,當然,實作類還有很多,比如java.util.logging、logback等等。我們都知道使用接口的好處就是~呃。。。假如你是一個沒有手腳的人,這時候你家裡有個機器人。隻需要告訴你的機器人你要見範冰冰,你的機器人就會去把範冰冰帶到你的面前,至于它怎麼做到的?也許用它自己的魅力勾引過來的,也許是直接使用暴力手段把範爺抗回來的。總之管它呢,女神已經站在你的面前了。嗯,這個比喻的很恰當!在這裡我們就以殘障人士slf4j和機器人,型号是log4j來做例子簡單的講解一下日志怎麼用。

首先,你要明白單獨使用slf4j你就想見到女神是不可能的→_→,你必須得要一個機器人去幫你做這件事。但是…目前市面上的機器人型号有很多種,有java.util.logging、logback、Apache log4j等等,我們這裡選擇長得帥一點的Apache log4j型号,到這裡我們已經引入了兩個jar包了,分别是:

  • slf4j的核心包

    slf4j-api.jar

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.7</version>
</dependency>
           
  • log4j的實作包log4j.jar
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.16</version>
</dependency>
           

可是這樣還不夠,要想讓log4j機器人服從你的指令,你還需要滴血認親,啊不,叫Binding包,其實就跟JDBC包一樣一樣的,不過這個比JDBC更簡單,這裡不需要任何配置,隻要你把這3個包放在一起,就能直接讓log4j機器人聽你差遣了。不過要注意Binding包的版本要和上面log4j的版本要一緻,上面的log4j是1.2版本的,對應的就應該是slf4j-log4j12.jar,如下:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.7</version>
</dependency>
           

其實slf4j原理很簡單,他隻提供一個核心slf4j api(就是slf4j-api.jar包),這個包隻有日志的接口,并沒有實作,是以如果要使用就得再給它提供一個實作了些接口的日志包,比如:log4j,common logging,jdk log日志實作包等,但是這些日志實作又不能通過接口直接調用,實作上他們根本就和slf4j-api不一緻,是以slf4j又增加了一層Binding來轉換各日志實作包的使用。

so…在項目中引入這三個包之後,再配置一下log4j的配置檔案,指定日志輸出格式,輸出目的地等等就能開始為所欲為了。

  • log4j.properties
#定義LOG輸出級别  
log4j.rootLogger=INFO,Console,File  
#定義日志輸出目的地為控制台  
log4j.appender.Console=org.apache.log4j.ConsoleAppender  
log4j.appender.Console.Target=System.out  
#可以靈活地指定日志輸出格式,下面一行是指定具體的格式  
log4j.appender.Console.layout = org.apache.log4j.PatternLayout  
log4j.appender.Console.layout.ConversionPattern=%p[%c] - %m%n  

#檔案大小到達指定尺寸的時候産生一個新的檔案  
log4j.appender.File = org.apache.log4j.RollingFileAppender  
#指定輸出目錄  
log4j.appender.File.File = ./logs/xcrm.log
#定義檔案最大大小  
log4j.appender.File.MaxFileSize = MB  
# 輸出是以日志,如果換成DEBUG表示輸出DEBUG以上級别日志  
log4j.appender.File.Threshold = INFO  
log4j.appender.File.layout = org.apache.log4j.PatternLayout  
log4j.appender.File.layout.ConversionPattern =[%p]-[%d{yy/MM/dd HH:mm:ss}][%c] - %m%n   
           

測試一下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LoginLogic {
    private static Logger logger = LoggerFactory.getLogger(LoginLogic.class);

    public static void main(String[] args) {
        logger.debug("輸出{}日志","debug");
        logger.info("輸出{}日志","info");
        logger.error("輸出{}日志","error");
    }
}
           
eclipse的正确使用方式

之是以沒輸入debug級别的原因是因為在配置檔案中過濾掉了輸出。發現和log4j的不同了嗎?在log4j中,為了提高運作效率,往往在輸出資訊之前,還要進行級别判斷,以避免無效的字元串連接配接操作。如下:

if (logger.isDebugEnabled()){
    logger.debug("debug:"+name);
}
           

slf4j巧妙的解決了這個問題:先傳入帶有占位符

{}

的字元串,同時把其他參數傳入,在slf4j的内容部實作中,如果級别合适再去用傳入的參數去替換字元串中的占位符,否則不用執行。

logger.info("{} is {}", new String[]{"x","y"});
           
eclipse的正确使用方式

浏覽檔案目錄

大家如果想打開eclipse中某個檔案所在位置是怎麼做的呢?

  • 右鍵檔案–>properties–>resource,然後複制路徑?
eclipse的正确使用方式
eclipse的正确使用方式
  • 還是安裝EasyExplorer 或 OpenExplorer插件?這個方法也比較簡單,google大把的教程,我就不贅述了。
  • 今天給大家介紹另一種不安裝插件的方法,看圖:

在toolbar中找到run這個圖示,點箭頭找到External Tools Configurations…

eclipse的正确使用方式

右鍵program–>new

eclipse的正确使用方式

在location中輸入

C:/WINDOWS/explorer.exe

,再到Arguments中輸入

${container_loc}

,為Tools取個名字openDir。

eclipse的正确使用方式

切換到common标簽,勾選External Tools,點Apply後關閉視窗。

eclipse的正确使用方式

選中想要打開的檔案,再點選openDir,就能打開檔案所在的目錄了。

eclipse的正确使用方式

THE END