云自無心水自閑

          天平山上白云泉,云自無心水自閑。何必奔沖山下去,更添波浪向人間!
          posts - 288, comments - 524, trackbacks - 0, articles - 6
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          今天下載了Apache James 3.0 Beta 5, 文件名:james-server-app-3.0.0-beta5-20150627.102412-1076-app.zip
          解壓,運行run.bat

          然后,注冊domain
          james-cli --host localhost adddomain example.com
          添加用戶
          james-cli.bat --host localhost adduser test@example.com password

          然后測試發送郵件,客戶端顯示發送成功,但是james服務器報錯,找不到MimeConfig的無參數構造函數。
          解決方法:
          使用舊的mime4j的jar包替換james 3.0 beta5中自帶的最新包。
          beta5中自帶的是0.8.0版,apache網站中可以下載到0.7.2
          下載apache-mime4j-0.7.2-bin.zip, 將其中的apache-mime4j-core-0.7.2.jar, apache-mime4j-dom-0.7.2.jar復制到james\lib目錄,
          并將其更名覆蓋原有的
          apache-mime4j-core-0.8.0-20150617.024907-738.jar
          apache-mime4j-dom-0.8.0-20150617.024927-735.jar
          重新啟動james, 發送郵件, 成功。

          posted @ 2015-10-08 08:45 云自無心水自閑 閱讀(3281) | 評論 (0)編輯 收藏

               摘要: 解壓/生成有密碼保護的壓縮文件, 研發過程中,作者研究了壓縮文件格式文檔: http://www.pkware.com/documents/casestudies/APPNOTE.TXT,并且參考了7-zip的實現。
            閱讀全文

          posted @ 2015-08-19 10:16 云自無心水自閑 閱讀(9964) | 評論 (0)編輯 收藏

               摘要: 花了兩天時間終于把windows10安裝好了,以下是我的一些個人的體會
            閱讀全文

          posted @ 2015-08-03 18:56 云自無心水自閑 閱讀(6258) | 評論 (0)編輯 收藏

          在JfinalConfig的繼承類中,
          configConstant() 需要設置me.setDevMode(true);

          1. 只有在DevMode下,才能禁止freeMarker的緩存。
          Configuration config = FreeMarkerRender.getConfiguration();
          config.setTemplateUpdateDelayMilliseconds(0);
          才會生效


          2. 這時才會有JFinal Action Report日志輸出

          posted @ 2015-07-24 19:58 云自無心水自閑 閱讀(419) | 評論 (0)編輯 收藏

          本文將簡單介紹如何使用PowerMock和Mockito來mock
          1. 構造函數
          2. 靜態函數
          3. 枚舉實現的單例
          4. 選擇參數值做為函數的返回值
          5. 在調用mock出來的方法中,改變方法參數的值

          一點簡要說明:Mockito其實已經可以滿足大部分的需求,但是它的實現機制是使用cglib來動態創建接口的類的實例。但是這種實現方式不能用于構造函數和靜態函數,因為那需要使用類的字節碼(比如使用javassist). 所以我們才需要結合使用PowerMock.

          1. mock構造函數, 如果有代碼沒有使用DI注入依賴實例,在單元測試中可以使用PowerMock來模擬創建對象。
          注意的開始兩行的2個注解 @RunWith 和 @PrepareForTest
          @RunWith比較簡單,后面始終是PowerMockRunner.class
          @PrepareForText后面需要加的是調用構造函數的類名,而不是有構造函數的類本身。
          在下面的例子中,我們要測試的類是:Helper, 在Helper類中調用了Somthing類的構造函數來創建實例。
          @RunWith(PowerMockRunner.class)
          @PrepareForTest(Helper.
          class)
          public class HelperTest {
            @Mock
            
          private Something mockSomething;
                
            @InjectMocks
            
          private Helper helper;
                
            @Test
            
          public void doSomething() throws Exception {
                String argument 
          = "arg";
                    
                PowerMockito.whenNew(Something.
          class).withArguments(argument).thenReturn(mockSomething);
                   
                // 調用需要測試方法
                helper.doSomething(argument);
                   
                // 進行驗證
                verify(mockSomething).doIt();
            }
          }


          public class Helper {
            public void doSomething(String arg) {
                Something something = new Something(arg);
                something.doit();
            }
          }


          2,mock 靜態函數, 單例模式就是一個典型的會調用靜態函數的例子。 注意要點與mock構造函數相同。
          class ClassWithStatics {
            
          public static String getString() {
              
          return "String";
            }

            
          public static int getInt() {
              
          return 1;
            }
          }

          @RunWith(PowerMockRunner.
          class)
          @PrepareForTest(ClassWithStatics.
          class)
          public class StubJustOneStatic {
            @Test
            
          public void test() {
              PowerMockito.mockStatic(ClassWithStatics.
          class);

              when(ClassWithStatics.getString()).thenReturn(
          "Hello!");

              System.out.println(
          "String: " + ClassWithStatics.getString());
              System.out.println(
          "Int: " + ClassWithStatics.getInt());
            }
          }

          3。mock枚舉實現的單例
          SingletonObject.java
          public enum SingletonObject { 
              INSTANCE
          ;
              private
          int num;
              protected
          void setNum(int num) {
                  this.num = num;
              }
              public int getNum() {
                  return
          num;
              }

          }
          SingletonConsumer.java

          public class SingletonConsumer {
              public String consumeSingletonObject() { 
                  return
          String.valueOf(SingletonObject.INSTANCE.getNum());
              }
          }
          SingletonConsumerTest.java
          @RunWith(PowerMockRunner.class) 
          @PrepareForTest({SingletonObject.class})
          public class SingletonConsumerTest {
              @Test public void testConsumeSingletonObject() throws Exception {
                  SingletonObject
          mockInstance = mock(SingletonObject.class);
                  Whitebox
          .setInternalState(SingletonObject.class, "INSTANCE", mockInstance);
                  when
          (mockInstance.getNum()).thenReturn(42);
                  assertEquals
          ("42", new SingletonConsumer().consumeSingletonObject());
              }
          }
          4。返回參數值做為函數返回值。
          mockito 1.9.5之后,提供一個方便的方法來實現這個需要,在這之前可以使用一個匿名函數來返回一個answer來實現。
          when(myMock.myFunction(anyString())).then(returnsFirstArg());
          其中returnsFirstArg()是org.mockito.AdditionalAnswers中的一個靜態方法。
          在這個類中還有其他的一些類似方法
          returnsSecondArg()
          returnsLastArg()
          ReturnsArgumentAt(int position)

          5. 在調用mock出來的方法中,改變方法參數的值
          when( myMock.someMethod( any( List.class ) ) ).thenAnswer( ( new Answer<Void>() {
              @Override
              
          public Void answer( InvocationOnMock invocation )
                      
          throws Throwable {
                  Object[] args 
          = invocation.getArguments();
                  List arg1 
          = (List)args[0];
                  arg1.add(
          "12345");
                  
          return null;
              }
          } ) );



          Verifying with generic parameters
          verify(someService).process(Matchers.<Collection<Person>>any());
          verify(adunoMasterBaseProcessor).processBinFiles( anyListOf(File.class) );

          posted @ 2015-06-16 21:27 云自無心水自閑 閱讀(18471) | 評論 (0)編輯 收藏

          Oracle提供的JDK其實已經自帶一定程度的熱加載功能,但是如果你修改了類名,方法名,或者添加了新類,新方法的話。
          Tomcat都需要重新啟動來使得剛才的更改生效。
          而JRebel和springloaded都能有效地解決這個問題。其中springloaded是開源軟件,可以免費使用,尤其難得。
          其主頁:https://github.com/spring-projects/spring-loaded
          在官方頁面的簡單介紹中,作者只講述了如何在java程序中應用springloaded,而沒有說明如何在tomcat中進行配置。
          本文將簡要進行介紹。

          1,下載springloaded到本地目錄,比如:c:\temp\springloaded-1.2.3.RELEASE.jar

          2. 修改tomcat的應用,禁止tomcat自己的熱加載,方法是在META-INF目錄下創建context.xml文件,里面包含如下語句,關鍵便是其中設置reloadable為false
          <?xml version="1.0" encoding="UTF-8"?>
          <Context antiResourceLocking="false" privileged="true" useHttpOnly="true" reloadable="false" />

          3.在運行環境中添加springloaded的jar文件,在eclipse中右鍵點擊項目,run as->run configuration
          在彈出的窗口中,選擇Arguments標簽,在vm arguments的末尾添加:
          -javaagent:C:\temp\springloaded-1.2.3.RELEASE.jar -noverify
          點擊應用按鈕。

          以上便完成了所有的配置,步驟并不復雜。

          posted @ 2015-06-11 21:59 云自無心水自閑 閱讀(7720) | 評論 (0)編輯 收藏

          java wrapper是一個可以用于將java應用程序包裝成windows服務的工具。
          并且可以通過簡單的配置來允許使用visualVM進行監控。

          配置方法:
          在wrapper.conf中添加如下3行

          wrapper.java.additional.1=-Dcom.sun.management.jmxremote.port=9898 #這里的端口號可以自行選擇。
          wrapper.java.additional.2=-Dcom.sun.management.jmxremote.ssl=false
          wrapper.java.additional.3=-Dcom.sun.management.jmxremote.authenticate=false

          修改完畢保存后重新啟動服務。

          打開visualVM, 在菜單中選擇 file->Add JMX Connection。
          在彈出窗口中,connection一項中輸入: localhost:9898 即可。

          此配置對于jconsole也同樣有效。

          posted @ 2015-06-11 14:09 云自無心水自閑 閱讀(4826) | 評論 (0)編輯 收藏

          在一些歷史遺留代碼中,會用到java.util.logging. 如果在新的項目中引用了這些代碼,而又不希望去一個一個的修改原來的代碼。
          可以使用slf4j提供的類來轉接這部分的日志輸出。

          方法:
          1、類路徑中添加
              slf4j-api-1.7.10.jar
              jul-to-slf4j.1.7.10.jar ( 用于將java.util.logging的日志橋接到slf4j中)
              logback-core.1.1.2.jar
              logback-classic-1.1.2.jar

          2、在代碼中添加:
                   // Optionally remove existing handlers attached to j.u.l root logger
                   SLF4JBridgeHandler.removeHandlersForRootLogger();  // (since SLF4J 1.6.5)

                   // add SLF4JBridgeHandler to j.u.l's root logger, should be done once during
                   // the initialization phase of your application
                   SLF4JBridgeHandler.install();

          注意事項:
          1、這個橋接可以會造成性能問題。
          和其他的橋接實現(比如:log4j, commons logging)不同,這個模塊并不真正的完全替代java.util.logging類,因為這個java.util.logging是java自帶的。
          所以只是把原來的日志對象進行了轉換,簡單的說,這個轉換過程是有開銷的。
          關鍵在于,不管日志語句有沒有根據日志級別被關閉,這個轉換無法避免。

          2、不能在類路徑中放入
          slf4j-jkd14.jar
          jul-toslf4j.jar

          posted @ 2015-04-27 15:31 云自無心水自閑 閱讀(1557) | 評論 (0)編輯 收藏

           1. Text Editor: Notepad++/Syncplify.me Notepad!
           2. Browser: Chrome/Firefox
           3. 文件管理: XYplorer Lite/Explorer++/Q-Dir
           4. Mind map: XMind Free
           5. Video player: PotPlayer
           6. Music player: Kugou
           7. Mysql client: HeidiSql
           8. PDF reader: Foxit Reader
           9. File/Folder synchronize : FreeFileSync
          10. MP3 tools: Audacity/MP3 Gain
          11. Zip: 7-zip
          12. Partition Management: EaseUS Partition Master Free / MiniTool Free Partition Manager 
          13. Data Recovery: EaseUS Data Recovery Wizard Free / MiniTool Free Data Recovery
          14. PDF Printer: PDF reDirect v2
          15. 個人信息管理: EssentialPIM Free Edition
          16. 遠程登錄: Terminals
          17. 文本比較合并: winmerge
          18. (s)FTP client: WinSCP
          19. 圖像處理: GIMP

          posted @ 2015-04-14 21:21 云自無心水自閑 閱讀(729) | 評論 (0)編輯 收藏

          Ember 是一個旨在創建大型web應用的JavaScript框架,它消除了樣板(boilerplate)并提供了標準的應用程序架構。

          Manning: Ember.js in action 第一章
          Manning: Ember.js in action 第五章

          posted @ 2015-03-23 12:37 云自無心水自閑 閱讀(3709) | 評論 (1)編輯 收藏

          僅列出標題
          共29頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          主站蜘蛛池模板: 小金县| 新安县| 碌曲县| 乌兰察布市| 革吉县| 广水市| 湘西| 疏勒县| 舒兰市| 惠来县| 怀柔区| 富锦市| 呼玛县| 横峰县| 富阳市| 武川县| 玛纳斯县| 贡嘎县| 兴义市| 晋宁县| 怀化市| 大悟县| 厦门市| 灵丘县| 永川市| 罗山县| 泰安市| 建德市| 习水县| 宝丰县| 宜兰县| 彭州市| 安康市| 五莲县| 乐山市| 平遥县| 武义县| 公主岭市| 武宁县| 新干县| 东丰县|