2014年7月16日

          Struts2學習

          幾年前學習了一陣子Struts2,也開發了些小項目,后來工作變動,幾年沒動技術,這兩天又想撿起來,發現一些配置有了變化,重新學習,記錄些內容,供自己查詢。

          環境沒敢用最新的,MyEclipse用的是8.5的版本,Tomcat最終選擇了6,JDK也是用的7,Struts2的版本2.3.16.3。通常的配置沒什么要記錄的,主要記錄下出問題的地方:
          1、Tomcat
          從MyEclipse啟動Tomcat一直報錯,后來下載了一個tcnative-1.dll文件才解決,版本要求比較嚴格,對于Tomcat6.0.41而言,這個動態鏈接庫版本要求是1.1.30,1.1.3都不行,不知道有什么區別,將文件拷貝到jre/bin下即可。
          2、web.xml文件內容
           1 <?xml version="1.0" encoding="UTF-8"?>
           2 <web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
           3 
           4     <display-name>Struts Test</display-name>
           5 
           6     <filter>
           7         <filter-name>struts2</filter-name>
           8         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
           9     </filter>
          10 
          11     <filter-mapping>
          12         <filter-name>struts2</filter-name>
          13         <url-pattern>/*</url-pattern>
          14     </filter-mapping>
          15 
          16     <welcome-file-list>
          17         <welcome-file>index.html</welcome-file>
          18     </welcome-file-list>
          19 
          20 </web-app>
          21 
          3、struts.xml文件內容
           1 <?xml version="1.0" encoding="UTF-8" ?>
           2 <!DOCTYPE struts PUBLIC
           3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
           4     "http://struts.apache.org/dtds/struts-2.3.dtd">
           5 
           6 <struts>
           7 
           8    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
           9     <constant name="struts.devMode" value="true" />
          10 
          11     <package name="default" namespace="/" extends="struts-default">
          12 
          13         <default-action-ref name="index" />
          14 
          15         <global-results>
          16             <result name="error">/error.jsp</result>
          17         </global-results>
          18 
          19         <global-exception-mappings>
          20             <exception-mapping exception="java.lang.Exception" result="error"/>
          21         </global-exception-mappings>
          22         
          23         <action name="action名" class="java包名及類名">
          24         <result name="success">/調用的jsp頁面文件p</result>
          25         </action>
          26     </package>
          27 
          28     <include file="example.xml"/>
          29 
          30     <!-- Add packages here -->
          31 
          32 </struts>
          33 
          4、調用時發現action名定義了大小寫后,地址欄也要輸入相應的大小寫,否則報錯。這個問題困擾了好久。。。。。


          By SeeSea

          posted @ 2014-07-16 10:47 SeesSea 閱讀(198) | 評論 (0)編輯 收藏

          2009年3月18日

          在ubuntu 8.04下安裝Oracle 11g方法

          項目要求使用Oracle,據說安裝方式比較繁復,網上搜到兩篇文章,先備著,準備日后按圖索驥。
          第一篇
          地址:http://forum.ubuntu.org.cn/viewtopic.php?f=44&t=136860

          在ubuntu 8.04下安裝Oracle 11g
          本文是參考了:http://hi.baidu.com/wuxicn/blog/item/0cfdc24ac5ae372609f7ef94.html"文章,是翻譯下面的這篇文章的。我主要參考的是中文的,我只是在實際操作中做了一點小小的修改,在此表示感謝!紫色為我的注釋。
          原文是英文,地址是:
          http://www.pythian.com/blogs/968/instal ... ardy-heron,(轉載注明出處,謝謝!! )
          共9步:

          Step 1
          下載和安裝 Ubuntu 8.04 Hardy Heron (x86-32位) 版。略。

          Step 2
          下載Oracle 11g: Download Oracle 11g for Linux (x86, 32-bit).
          現不要急著解壓,一會我會告訴你解壓在哪的。

          Step 3
          修改X server 的默認設置,點菜單的System -> Administration -> Login Window(系統->管理->登錄窗口),選擇“Security(安全)”選項卡,取消“Deny TCP connections to the Xserver(拒絕TCP連接到X服務器)”的勾,重啟Xserver(或者重啟系統)。然后在終端輸入:
          user@hardy:~$ xhost +127.0.0.1
          127.0.0.1 being added to access control list
          Step 4
          打開終端,轉換為超級用戶:(注意,這里用sudo su -而不是sudo -s是有原因的:sudo su - 將用戶轉換為超級用戶,并新起一個會話(空的會話),而不是像sudo -s那樣將當前會話傳遞個新的超級用戶,減少環境變量可能造成的影響和危害。
          user@hardy:~$ sudo su -
          [sudo] password for user:
          root@hardy:~# apt-get update
          ...
          root@hardy:~# apt-get dist-upgrade
          ...
          root@hardy:~# reboot
          Step 5
          用apt安裝一些必要的工具:

          user@hardy:~$ sudo su -
          [sudo] password for user:
          root@hardy:~# apt-get install build-essential libaio1 gawk ksh libmotif3 alien libtool lsb-rpm
          ...
          root@hardy:~#
          Step 6
          在裝完那些工具以后,我們需要做的就是修改一些Ubuntu的/bin/sh的默認連接,千萬不要略過這一步,否則安裝的時候會出現很多錯誤。
          root@hardy:~# cd /bin
          root@hardy:/bin# ls -l /bin/sh
          lrwxrwxrwx 1 root root 4 2008-04-28 19:59 /bin/sh -> dash
          root@hardy:/bin# ln -sf bash /bin/sh
          root@hardy:/bin# ls -l /bin/sh
          lrwxrwxrwx 1 root root 4 2008-05-01 22:51 /bin/sh -> bash
          如果你想知道為什么Ubuntu用dash作為默認的shell,看這個:a detailed explanation of why dash is the default system shell 。
          Step 7
          增加用戶和組,并修改一些配置。這一步很重要!如果不是很有把握,不要隨便改。(為了便于解釋,增加了行號):
          01 root@hardy:/bin# cd
          02 root@hardy:~# pwd
          /root
          04 root@hardy:~# addgroup oinstall
          Adding group `oinstall' (GID 1001) ...
          Done.
          07 root@hardy:~# addgroup dba
          Adding group `dba' (GID 1002) ...
          Done.
          10 root@hardy:~# addgroup nobody
          Adding group `nobody' (GID 1003) ...
          Done.
          13 root@hardy:~# usermod -g nobody nobody
          14 root@hardy:~# useradd -g oinstall -G dba -p password -d /home/oracle -s /bin/bash oracle
          15 root@hardy:~# mkdir /home/oracle
          16 root@hardy:~# chown -R oracle:dba /home/oracle
          17 root@hardy:~# ln -s /usr/bin/awk /bin/awk
          18 root@hardy:~# ln -s /usr/bin/rpm /bin/rpm
          19 root@hardy:~# ln -s /usr/bin/basename /bin/basename
          20 root@hardy:~# mkdir /etc/rc.d
          21 root@hardy:~# for i in 0 1 2 3 4 5 6 S ; do ln -s /etc/rc$i.d /etc/rc.d/rc$i.d ; done
          22 root@hardy:~# mkdir -p /u01/app/oracle
          23 root@hardy:~# chown -R oracle:dba /u01
          24 root@hardy:~#
          Lines 04-12: 增加我們需要的用戶和組
          Line 13: 讓nobody用戶的組變為nobody,這樣Oracle的安裝程序不會出問題。Ubuntu默認nobody的組是nogroup。
          Lines 14-18: 創建一個oracle用戶。注意,oracle用戶的HOME目錄不要與ORACLE_HOME相同。
          Lines 19-23: 創建一些Oracle安裝程序需要的工具的連接。因為Oracle安裝程序是為Red Hat準備的,所以有些工具的位置和Ubuntu不一樣。
          Finally, on lines 24-25 創建ORACLE_BASE目錄。
          Step 8
          修改一些系統默認值。這些修改將會增加系統文件描述符的數量、增加共享內存大小和修改一些網絡子系統參數。這些修改是否會對你的系統帶來影響我就不得而知了。將下面這些增加到/etc/sysctl.conf文件的末尾:
          fs.file-max = 65535
          kernel.shmall = 2097152
          kernel.shmmax = 2147483648
          kernel.shmmni = 4096
          kernel.sem = 250 32000 100 128
          net.ipv4.ip_local_port_range = 1024 65535
          net.core.rmem_default = 1048576
          net.core.rmem_max = 1048576
          net.core.wmem_default = 262144
          net.core.wmem_max = 262144
          再增加下面這些到/etc/security/limits.conf文件末尾:

          oracle soft nproc 2047
          oracle hard nproc 16383
          oracle soft nofile 1023
          oracle hard nofile 65535
          為了強制使用剛才我們增加的東西,我們再增加下面這些到/etc/pam.d/login文件末尾:

          session required /lib/security/pam_limits.so
          session required pam_limits.so
          然后通過命令:sysctl -p 讓剛才增加的東西生效:

          root@hardy:~# sysctl -p
          kernel.printk = 4 4 1 7
          kernel.maps_protect = 1
          fs.inotify.max_user_watches = 524288
          vm.mmap_min_addr = 65536
          net.ipv4.conf.default.rp_filter = 1
          net.ipv4.conf.all.rp_filter = 1
          fs.file-max = 65535
          kernel.shmall = 2097152
          kernel.shmmax = 2147483648
          kernel.shmmni = 4096
          kernel.sem = 250 32000 100 128
          net.ipv4.ip_local_port_range = 1024 65535
          net.core.rmem_default = 1048576
          net.core.rmem_max = 1048576
          net.core.wmem_default = 262144
          net.core.wmem_max = 262144
          root@hardy:~#
          Step 9
          現在我們將剛才下載的oracle11g的安裝包解壓到/home/oracle/install/目錄下。然后進入目錄,設置DISPLAY參數,開始安裝:

          root@hardy:~# cd /home/oracle
          root@hardy:/home/oracle# chown -R oracle:dba install

          用oracle用戶登陸,(不然會出安裝界面出不來)
          oracle@hardy:~$ export DISPLAY=127.0.0.1:0.0
          oracle@hardy:~$ pwd
          /home/oracle
          oracle@hardy:~$ ls -l
          total 4
          drwxr-xr-x 6 oracle dba 4096 2007-09-18 18:50 install
          oracle@hardy:~$ cd install
          oracle@hardy:~/install$ ls -l
          total 28
          drwxr-xr-x 11 oracle dba 4096 2007-08-06 16:02 doc
          drwxr-xr-x 5 oracle dba 4096 2007-08-03 13:28 install
          drwxr-xr-x 2 oracle dba 4096 2007-09-18 18:52 response
          -rwxr-xr-x 1 oracle dba 2911 2007-08-03 13:28 runInstaller
          drwxr-xr-x 14 oracle dba 4096 2007-08-03 13:27 stage
          -rw-r--r-- 1 oracle dba 4835 2007-08-06 18:19 welcome.html
          oracle@hardy:~/install$ ./runInstaller -ignoreSysPrereqs
          輸入完上面命令后,就進入了Oracle 的同一安裝程序了(OUI),不要急,繼續按照本文一步一步的通過安裝:
          注意:OUI安裝完后,并不是真正完全安裝完成,還需要就行最后的收尾工作(在最后有),而且這是必須做的工作!


          點(Next)下一步。


          修改“Specify Operating System group name:”為:"dba",然后點"Next".


          按照上圖設置,點下一步。


          選擇"Enterprise Edition",然后下一步。


          安圖設置,下一步。


          繼續下一步。


          等待系統檢查,不要擔心有錯誤和警告。


          將檢查到的所有非“Succeeded”的都打上勾,下一步。


          ,下一步。在這一步選"Create a Database"來安裝數據庫。([color=red]原文是通過netca建立監聽,dbca建庫,我第一次也是這樣做的,dbca建庫時會報錯,因為ubutunbu 不支持RPM包)。[/color]

          將所有組都設為:dba,下一步。

          現在可以點“Install”了:)時間比較長。


          到了這一步不要記著點“OK”,需要做下面操作:(另起一個終端,用sudo su - 轉為超級用戶)

          root@hardy:~# /u01/app/oraInventory/orainstRoot.sh
          Changing permissions of /u01/app/oraInventory to 770.
          Changing groupname of /u01/app/oraInventory to dba.
          The execution of the script is complete
          root@hardy:~# /u01/app/oracle/product/11.1.0/db_1/root.sh
          Running Oracle 11g root.sh script...

          The following environment variables are set as:
          ORACLE_OWNER= oracle
          ORACLE_HOME= /u01/app/oracle/product/11.1.0/db_1

          Enter the full pathname of the local bin directory: [/usr/local/bin]:
          Copying dbhome to /usr/local/bin ...
          Copying oraenv to /usr/local/bin ...
          Copying coraenv to /usr/local/bin ...

          Creating /etc/oratab file...
          Entries will be added to the /etc/oratab file as needed by
          Database Configuration Assistant when a database is created
          Finished running generic part of root.sh script.
          Now product-specific root actions will be performed.
          Finished product-specific root actions.
          root@hardy:~#
          好了,這個完成后可以點“OK”了。
          安后點“Exit”退出OUI,現在可以祝賀你,OUI安裝完成了:)但是還是不要急,記住咱們還有收尾工作需要做。
          在/etc/profile文件中加入下面幾句:

          export ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1
          export PATH=$PATH:/u01/app/oracle/product/11.1.0/db_1/bin
          創建一個Oracle 11g數據庫的啟動腳本,名字可以叫做:oracledb,在/u01/app/oracle/product/11.1.0/db_1/bin下建立文件:oracledb,內容:

          #!/bin/bash
          #
          # /etc/init.d/oracledb
          #
          # Run-level Startup script for the Oracle Listener and Instances
          # It relies on the information on /etc/oratab

          export ORACLE_BASE=/u01/app/oracle
          export ORACLE_HOME=/u01/app/oracle/product/11.1.0/db_1
          export ORACLE_OWNR=oracle
          export PATH=$PATH:$ORACLE_HOME/bin

          if [ ! -f $ORACLE_HOME/bin/dbstart -o ! -d $ORACLE_HOME ]
          then
          echo "Oracle startup: cannot start"
          exit 1
          fi

          case "$1" in
          start)
          # Oracle listener and instance startup
          echo -n "Starting Oracle: "
          su $ORACLE_OWNR -c "$ORACLE_HOME/bin/lsnrctl start"
          su $ORACLE_OWNR -c "$ORACLE_HOME/bin/dbstart $ORACLE_HOME"
          touch /var/lock/oracle
          echo "OK"
          ;;
          stop)
          # Oracle listener and instance shutdown
          echo -n "Shutdown Oracle: "
          su $ORACLE_OWNR -c "$ORACLE_HOME/bin/lsnrctl stop"
          su $ORACLE_OWNR -c "$ORACLE_HOME/bin/dbshut $ORACLE_HOME"
          rm -f /var/lock/oracle
          echo "OK"
          ;;
          reload|restart)
          $0 stop
          $0 start
          ;;
          *)
          echo "Usage: `basename $0` start|stop|restart|reload"
          exit 1
          esac

          exit 0
          修改腳本為可執行的:

          root@hardy:~# chmod a+x /u01/app/oracle/product/11.1.0/db_1/bin/oracledb
          如果你希望開機自動啟動Oracle 11g數據庫,那么就作下面的工作:

          root@hardy:~# ln -s /u01/app/oracle/product/11.1.0/db_1/bin/oracledb /etc/init.d/oracledb
          root@hardy:~# sudo sysv-rc-conf --level 2345 oracledb on

          如果沒有sysv-rc-conf命令,就apt-get一個。
          最后,增加你自己的用戶名到dba組:

          root@hardy:~# usermod -G dba -a user
          好了,至此,Oracle 11g就安裝完了。重新登錄后,你就可以使用oracle的命令了。
          (ORACLE_SID=orcl 是你安裝時候設置的值)

          oracle@hardy:~$ export ORACLE_SID=orcl
          oracle@hardy:~$ sqlplus '/as sysdba'

          SQL*Plus: Release 11.1.0.6.0 - Production on Mon May 5 02:39:27 2008

          Copyright (c) 1982, 2007, Oracle. All rights reserved.

          Connected to:
          Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
          With the Partitioning, OLAP, Data Mining and Real Application Testing options

          SQL>connect /as sysdba
          Connected to an idle instance.

          SQL>startup 啟動數據庫命令。
          .
          ORACLE instance started.



          Total System Global Area 418484224 bytes

          Fixed Size 1300324 bytes

          Variable Size 281020572 bytes

          Database Buffers 130023424 bytes

          Redo Buffers 6139904 bytes

          Database mounted.

          Database opened.

          oracle@hardy:~$ export ORACLE_SID=orcl
          oracle@hardy:~$ emctl start dbconsole 啟動EM,地址為https://yourip:1158/em/console.這樣你就可以通過IE登陸了。不過界面為亂碼。呵呵!!解決方法自己在網上找吧!!

          如果你看到了上面的結果,證明你的oracle安裝成功了。

          第二篇
          地址:http://www.linuxidc.com/Linux/2008-06/13855.htm

          花了半天時間,在Ubuntu 8.04 LTS上順利安裝Oracle 11G.下面說說大概的步驟.

          1.確保安裝了以下程序:

          sudo apt-get install build-essential libaio1 gawk ksh libmotif3 alien libtool lsb-rpm

          2.

          cd /bin
          ln -sf bash /bin/sh

           

          3.增加用戶和組

          addgroup oinstall
          addgroup dba
          addgroup nobody
          useradd -g oinstall -G dba -p passwd -d /home/oracle -s /bin/bash oracle
          usermod -g nobody nobody

          4.
          mkdir /home/oracle
          chown -R oracle:dba /home/oracle

          ln -s /usr/bin/awk /bin/awk
          ln -s /usr/bin/rpm /bin/rpm
          ln -s /usr/bin/basename /bin/basename

          5.
          mkdir /etc/rc.d
          for i in 0 1 2 3 4 5 6 S ; do ln -s /etc/rc$i.d /etc/rc.d/rc$i.d ; done

          mkdir -p /opt/ora11
          chown -R oracle:dba /opt

          6.編輯/etc/sysctl.conf,增加以下內容:

          fs.file-max = 65535
          kernel.shmall = 2097152
          kernel.shmmax = 2147483648
          kernel.shmmni = 4096
          kernel.sem = 250 32000 100 128
          net.ipv4.ip_local_port_range = 1024 65535
          net.core.rmem_default = 1048576
          net.core.rmem_max = 1048576
          net.core.wmem_default = 262144
          net.core.wmem_max = 262144

          7.編輯/etc/security/limits.conf,增加以下內容:

          oracle soft nproc 2047
          oracle hard nproc 16383
          oracle soft nofile 1023
          oracle hard nofile 65535

          8.編輯/etc/pam.d/login,增加以下內容:

          session required /lib/security/pam_limits.so
          session required pam_limits.so

          9.執行:

          sysctl -p

          10.

          su - oracle

          以上命令需以root用戶執行,接下來切換至oracle用戶.

          11.切換至安裝目錄,開始安裝.我選擇了英語作為安裝時顯示的語言.

          export LANG=en_CN
          ./runInstaller

          12.安裝過程中提示運行以下兩個腳本:

          orainstRoot.sh
          root.sh

          12.安裝過程中檢測到系統未裝有GLIBC環境,忽略后,未發現對安裝和運行有多大影響.

          13.切記,安裝時選擇自定義,并且選擇數據庫的字符集為 ZHS16GBK!

          因為忘記了這個選項,我只好刪掉數據庫,重新建了一個,浪費了半個小時的時間.

          PS.ORACLE 11g好像不支持更改數據庫的字符集了...或是我沒有找到正確的方法

          14.安裝完成后,數據庫的連接和查詢異常之慢,GOOGLE之,然后嘗試著把網絡的DNS服務器全給刪了,解決.

          15.兩個常用的工具:dbca和netca.



           

          posted @ 2009-03-18 10:52 SeesSea 閱讀(540) | 評論 (0)編輯 收藏

          2008年8月12日

          Struts2 action 的 ;jsessionid=xxx 使找不到頁面 Bug 的解決 [轉帖]

               摘要: 原文地址 自己留個地址,遇到這個問題可以考慮使用。不過要重新編譯struts2的jar包確實比較。。。 剛剛又找到一個解決辦法: 在用Struts的時候發現這樣一個問題,不管我們的程序中是否創建了一個新的session,從頁面提交表單到action類,再跳轉到頁面的時候url中總是出現了;jsessionid這樣的一長串內容,這是由于新建的session導致容器產生的。 經過深入研究s...  閱讀全文

          posted @ 2008-08-12 10:40 SeesSea 閱讀(3785) | 評論 (0)編輯 收藏

          2008年8月6日

          Struts2設置

          這幾天總有其他事情在忙,現在有一點點時間了,嘗試學習Struts2,灑家屬于超級新人,一步一步記錄吧。
          1、下載Struts2的jar包。下載地址:
          http://struts.apache.org/2.0.9/index.html
          2、解壓縮必要文件到項目中WebRoot\WEB-INF\lib下。灑家最開始引用的為:
          commons-logging-1.0.4.jar
          ognl-2.6.11.jar
          xwork-2.0.4.jar
          freemarker-2.3.8.jar
          struts2-core-2.0.11.1.jar
          3、修改項目中WebRoot\WEB-INF\web.xml文檔,增加如下內容
          <filter>
             
          <filter-name>struts2</filter-name>
             
          <filter-class>
             org.apache.struts2.dispatcher.FilterDispatcher
             
          </filter-class>
          </filter>
          <filter-mapping>
             
          <filter-name>struts2</filter-name>
             
          <url-pattern>/*</url-pattern>
          </filter-mapping> 
          4、在項目中WebRoot/WEB-INF/classes下建立struts.xml文件。如果在MyEclipse中,可以直接建立在項目的src目錄中,MyEclipse將自動將其拷貝到發布目錄的相關位置。文件內容如下:
          <?xml version="1.0" encoding="UTF-8" ?>
          <!DOCTYPE struts PUBLIC
              "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
              "http://struts.apache.org/dtds/struts-2.0.dtd"
          >
              
          <struts>
              
          <package name="struts2" extends="struts-default">
              
          <!--
              此處加入不同的action
              
          -->
              
          </package>
              
          </struts>
             
          5、建立jsp文件
          如果使用struts的標簽,則需要在jsp文件的第一行后插入:
          <%@ taglib prefix="s" uri="/struts-tags" %>
          暫時有事,回頭補充。

          posted @ 2008-08-06 16:27 SeesSea 閱讀(256) | 評論 (0)編輯 收藏

          2008年8月1日

          Ubuntu下的tomcat啟動

              上一個項目由于奧運的關系不能調試,只能先放下了。新的任務是一個b/s項目,徹底陌生的領域。以前做過的的項目全部都是C#.net下的東東。這次用jsp。又一次痛苦的學習歷程。
              還是喜歡ubuntu下的調試環境,所以還想選擇在這個下面開發。
              先在原有eclipse上安裝了MyEclipse,這次比較順利,記得上次安裝比較費勁,總是啟動不了,或許是因為這臺機器是inter的CPU緣故?不得而知。
              安裝TomCat遇到一些問題,主要是TomCat總是隨系統啟動,每次開機都需要手動關閉服務,比較麻煩。由于對ubuntu不熟悉,找了下方法,感覺比較好的方法如下:
          安裝sysv-rc-conf
          方法:
          sudo apt-get install sysv-rc-conf
          sudo sysv-rc-conf

          這個工具可以調整啟動項目,比較方便。


          posted @ 2008-08-01 11:27 SeesSea 閱讀(2319) | 評論 (0)編輯 收藏

          2008年7月24日

          Eclipse發布程序

          辛辛苦苦在Eclipse里面寫好東西,不會發布,網絡上搜到的大多都是關于MyEclipse發布web方式。不過也難怪人家不寫,因為是在比較簡單。只要直接導出Jar文件就可以了,是在沒什么可以寫的,都怪灑家太笨了。
          不過導出后遇到一些問題,就是第三方jar文件錯誤,這個找了一下,同樣在BlogJava上有人發表了方法,他推薦的是第一種方法,灑家用的是第二種。原文見http://www.aygfsteel.com/mimi-van/archive/2007/11/28/163597.html
          為了自己閱讀方便,也粘貼一份吧。失敬,失敬!

          我存檔的一篇java資料,里面對 -jar 情況下的classpath 有了比較詳細的闡述。

          當用java -jar yourJarExe.jar來運行一個經過打包的應用程序的時候,你會發現如何設置-classpath參數應用程序都找不到相應的第三方類,報 ClassNotFound錯誤。實際上這是由于當使用-jar參數運行的時候,java VM會屏蔽所有的外部classpath,而只以本身yourJarExe.jar的內部class作為類的尋找范圍。

          **解決方案**

          一 BootStrap class擴展方案

          Java 命令行提供了如何擴展bootStrap 級別class的簡單方法.
          -Xbootclasspath:     完全取代基本核心的Java class 搜索路徑.
                                             不常用,否則要重新寫所有Java 核心class
          -Xbootclasspath/a: 后綴在核心class搜索路徑后面.常用!!
          -Xbootclasspath/p: 前綴在核心class搜索路徑前面.不常用,避免
                                             引起不必要的沖突.

          語法如下:
           (分隔符與classpath參數類似,unix使用:號,windows使用;號,這里以unix為例)
           java -Xbootclasspath/a:/usrhome/thirdlib.jar: -jar yourJarExe.jar

          二 extend class 擴展方案

          Java exten class 存放在{Java_home}"jre"lib"ext目錄下.當調用Java時,對擴展class路徑的搜索是自動的.總會搜索的.這樣,解決的方案就很簡單了,將所有要使用的第三方的jar包都復制到ext 目錄下.

          三 User class擴展方案

          當使用-jar執行可執行Jar包時,JVM將Jar包所在目錄設置為codebase目錄,所有的class搜索都在這個目錄下開始.所以如果使用了其他第三方的jar包,一個比較可以接受的可配置方案,就是利用jar包的Manifest擴展機制.
          步驟如下:

           1.將需要的第三方的jar包,復制在同可執行jar所在的目錄或某個子目錄下. 比如:jar 包在 /usrhome/yourJarExe.jar 那么你可以把所有jar包復制到/usrhome目錄下或/usrhome/lib 等類似的子目錄下.

           2.修改Manifest 文件

           在Manifest.mf文件里加入如下行

           Class-Path:classes12.jar lib/thirdlib.jar

           Class-Path 是可執行jar包運行依賴的關鍵詞.詳細內容可以參考 http://java.sun.com/docs/books/tutorial/deployment/jar/downman.html 。 要注意的是 Class-Path 只是作為你本地機器的CLASSPATH環境變量的一個縮寫,也就是說用這個前綴表示在你的jar包執行機器上所有的CLASSPATH目錄下尋找相應的 第三方類/類庫。你并不能通過 Class-Path 來加載位于你本身的jar包里面(或者網絡上)的jar文件。因為從理論上來講,你的jar發布包不應該再去包含其他的第三方類庫(而應該通過使用說明來 提醒用戶去獲取相應的支持類庫)。如果由于特殊需要必須把其他的第三方類庫(jar, zip, class等)直接打包在你自己的jar包里面一起發布,你就必須通過實現自定義的ClassLoader來按照自己的意圖加載這些第三方類庫。


          以上三種方法推薦第一種,擴展性好,操作起來也最方便.
          另外編寫自己的ClassLoader,來動態載入class,是更加復雜和高級技術.限于篇幅,不贅述.有興趣了解可以去google一下custom classloader,或者參考我的另一篇日志:讓classpath參數走開

          Java的安全機制隨不同的JDK版本有不同的變化,會影響很多核心CLASS,比如Thread,所以很多大型商業軟件,要求JDK的版本很嚴格.部分原因也在此.這也要求在發布自己編寫的應用時候,不管大小,都要說明開發和測試的JDK版本.


          本文所述方法測試基于j2sdk 1.4.2_04-b05

          ----------------------------------------------------------------------------------------------

          附:背景知識

          自JDK 1.2以后,JVM采用了委托(delegate)模式來載入class.采用這種設計的原因可以參考http://java.sun.com/docs/books/tutorial/ext/basics/load.html

          歸納來講:是基于JVM sandbox(沙盒)安裝模型上提供應用層的可定制的安全機制.


          Java虛擬機(JVM)尋找Class的順序

          1. Bootstrap classes

          屬于Java 平臺核心的class,比如java.lang.String等.及rt.jar等重要的核心級別的class.這是由JVM Bootstrap class loader來載入的.一般是放置在{java_home}"jre"lib目錄下

          2. Extension classes

          基于Java擴展機制,用來擴展Java核心功能模塊.比如Java串口通訊模塊comm.jar.一般放置在{Java_home}"jre"lib"ext目錄下

          3. User classes

          開發人員或其他第三方開發的Java程序包.通過命令行的-classpath或-cp,或者通過設置 CLASSPATH環境變量來引用.JVM通過放置在{java_home}"lib"tools.jar來尋找和調用用戶級的class.常用的 javac也是通過調用tools.jar來尋找用戶指定的路徑來編譯Java源程序.這樣就引出了User class路徑搜索的順序或優先級別的問題.

           3.1 缺省值:調用Java或javawa的當前路徑(.),是開發的class所存在的當前目錄
           3.2 CLASSPATH環境變量設置的路徑.如果設置了CLASSPATH,則CLASSPATH的值會覆蓋缺省值
           3.3 執行Java的命令行-classpath或-cp的值,如果制定了這兩個命令行參數之一,它的值會覆蓋環境變量CLASSPATH的值
           3.4 -jar 選項:如果通過java -jar 來運行一個可執行的jar包,這當前jar包會覆蓋上面所有的值.換句話說,-jar 后面所跟的jar包的優先級別最高,如果指定了-jar選項,所有環境變量和命令行制定的搜索路徑都將被忽略.JVM APPClassloader將只會以jar包為搜索范圍.
          有關可執行jar有許多相關的安全方面的描述,可以參考http://java.sun.com/docs/books/tutorial/jar/ 來全面了解.

          這也是為什么應用程序打包成可執行的jar包后,不管你怎么設置classpath都不能引用到第三方jar包的東西了

          關于 什么是 jar文件可以參看以下鏈接:

          http://www-128.ibm.com/developerworks/cn/java/j-jar/index.html


          灑家測試的環境是:Ubuntu8.04+jdk 1.6+Eclipse 3.2。

          posted @ 2008-07-24 16:19 SeesSea 閱讀(2846) | 評論 (0)編輯 收藏

          JAVA實現CRC16校驗

          要求:

          CRC循環冗余錯誤校驗計算方法

          CRC-16C(循環冗余錯誤校驗)生成CRC-16校驗字節的步聚如下:

          (1)裝入一個16位寄存器,所有數位均為1

          (2)16位寄存器的高位字節與開始8位字節進行“異或”運算。運算結果放入這個16位寄存器。

          (3)把這個16位寄存器向右移1位。

          (4a)若向右(標記位)移出的數位是1,則生成多項式1010000000000001和這個寄存器進行“異或”運算。

          (4b)若向右移出的數位是0,則返回(3)

          (5)重處處(3)(4),直至移出8位。

          (6)另外8位與該16位寄存器進行“異或”運算。

          (7)重處處(3)-(6),直至該報文所有字節均與16位寄存器進行“異或”運算,并移位8次。

          (8)這個16位寄存器的內容即2字節CRC錯誤校驗。

          public class CRC {
              
          private byte[] CRC=new byte[2];
              
              
          byte data;
              
          byte[] reg=new byte[2];
              
          byte[] ploy=new byte[2];
              
          byte Op;
              
              
          public CRC(byte[] source){
                  
          //初始化多項式
                  int temp=0xA001;
                  ploy
          =InttoByteArray(temp,2);
                  
          //初始化寄存器
                  temp=0xFFFF;
                  reg
          =InttoByteArray(temp,2);
                  
                  
          for(int i=0;i<source.length;i++){
                      
          //獲取數據
                      data=source[i];
                      
          //與寄存器中數據進行異或操作
                      reg[1]=(byte) (reg[1]^data);
                      
          //移動數據
                      for(int j=0;j<8;j++){
                          
          //獲取數據的最后一位,即被移動出的數據判斷是否與多項式異或
                          Op=reg[0];
                          
          //右移一位
                          reg=InttoByteArray(ByteArraytoInt(reg)>>1,2);
                          
          //如果移出數據為1
                          if((Op&0x01)==1){
                              
          //與多項式進行異或操作
                              reg[0]=(byte) (reg[0]^ploy[0]);
                              reg[
          1]=(byte) (reg[1]^ploy[1]);
                          }                
                      }
                  }
                  CRC
          =reg;        
              }

              
          public byte[] getCRC() {
                  
          return CRC;
              }
          //格式化輔助函數
              private static byte[] InttoByteArray(int iSource, int iArrayLen) {
                  
          byte[] bLocalArr = new byte[iArrayLen];
                  
          for ( int i = 0; (i < 4&& (i < iArrayLen); i++) {
                      bLocalArr[i] 
          = (byte)( iSource>>8*& 0xFF );          
                  }
                  
          return bLocalArr;
              }
              
              
          private static int ByteArraytoInt(byte[] bRefArr) {
                  
          int iOutcome = 0;
                  
          byte bLoop;
                  
                  
          for ( int i =0; i<bRefArr.length ; i++) {
                      bLoop 
          = bRefArr[i];
                      iOutcome
          += (bLoop & 0xFF<< (8 * i);
                    
                  }         
                  
          return iOutcome;
              }    
          }

          開始把高低位搞混了,以為reg[0]是高位,調整了半天。郁悶!
          另外,好像CRC算法也有好多種,我就沒在網上找到用戶要求的這種算法。貌似這個算法是Modbus協議中的CRC校驗方式。有待確認。

          posted @ 2008-07-24 12:11 SeesSea 閱讀(8742) | 評論 (2)編輯 收藏

          2008年7月22日

          Ubuntu load/unload cycle count問題

          開始使用T61后就安裝了Ubuntu。當時就看到說Ubuntu電源管理有缺陷,會損傷硬盤,沒有太在意,只是查詢了一下當時的load/unload cycle count的值,大約3000+的樣子。使用了半個月的今天,再次查詢此值著實讓人吃驚,已經到了驚人的近20000,按照這個速度,硬盤設計的600000次估計也就能維持10個月。找來解決方案如下,不知是否有效,試一段時間再說吧。畢竟硬盤熱或者費電比起數據丟失都是太微不足道了。


          安裝 laptop-mode,手動編輯 /etc/laptop-mode/laptop-mode.conf,大概 216 行左右,按如下修改:

          #
          # Should laptop mode tools control the hard drive power management settings?
          #
          CONTROL_HD_POWERMGMT=1


          #
          # Power management for HD (hdparm -B values)
          #
          BATT_HD_POWERMGMT=192
          LM_AC_HD_POWERMGMT=254
          NOLM_AC_HD_POWERMGMT=254


          第 一項是為了讓對硬盤參數的設置納入 laptop-mode 管理(默認不開)。后面三個就是指定各種模式下的硬盤參數了。默認情況下是 1/255/255。1 這個值太激進(估計 3 分鐘 1 次就是它干的),我改成了 192(電池模式下畢竟還是要省電的,雖然這個值在不同品牌的硬盤可能表現差異很大,但是根據我搜索的結果,設置成 192 的時候硬盤已經很難有機會自行 unload 了)。后兩個默認值 255 是可以不改的,但是 255 是直接關閉 APM(高級電源管理),據說某些硬盤可能會忽略 255 這個極端值,所以改成 254(我的出發點其實還是不想舍棄 APM)。

          然后是修改 /etc/default/acpi-support 這個文件。文件末尾兩個參數,按如下設置:

          # Switch to laptop-mode on battery power - off by default as it causes odd
          # hangs on some machines
          ENABLE_LAPTOP_MODE=true

          # Spindown time on battery
          SPINDOWN_TIME=60


          第一項是開啟 laptop-mode,第二項似乎是控制用來控制硬盤空閑多長時間自動斷電的,可根據自己喜好修改(默認值是 12)。

          經幾天觀察,基本上這個 Load Cycle Count 只在關機的時候才會增加了。

          附:監測 Load Cycle Count 的方法

          sudo smartctl -a /dev/sda


          設備可能是 /dev/hda(IDE 硬盤)或 /dev/sdb(第二塊硬盤)等等。如果覺得輸出太多,可以加上 grep 193。


          sudo smartctl -a /dev/sda | grep 193

          補充:
          2008年07月24日
          試運行了幾天,至少從開機到關機,Ubuntu中的這個值不再變化。不過好像是硬盤比以前熱一些了,或許是心里作用。但是在Vista中這個數據還在增加,具體值沒有算過,最近項目是Linux里的,不怎么用Win系統,等常用時候在關注吧。

          posted @ 2008-07-22 01:57 SeesSea 閱讀(677) | 評論 (0)編輯 收藏

          2008年7月20日

          JAVA基本數據類型與其他語言數據類型之間的轉換方法 (ZT)

               摘要: 在寫網絡通信程序的時候非常非常有用
          通信格式轉換
          Java和一些windows編程語言如c、c++、delphi所寫的網絡程序進行通訊時,需要進行相應的轉換
          高、低字節之間的轉換
          windows的字節序為低字節開頭
          linux,unix的字節序為高字節開頭
          java則無論平臺變化,都是高字節開頭  閱讀全文

          posted @ 2008-07-20 12:02 SeesSea 閱讀(325) | 評論 (0)編輯 收藏

          2008年7月19日

          XML讀取

          今天需要在C#下讀取XML,查了N多文章,都寫的太復雜。灑家只要讀取一些基本信息做系統初始化用。沒法子,只好翻出以前代碼。留在這里一份,以備后查。
          另,前幾天找JAVA的讀取XML,網上很多也是比較繁復。費了點力氣才搞定,回頭另開一篇粘進去。

           XmlTextReader xmlReader = new XmlTextReader("path/filename.xml");
           while (xmlReader.Read())
           {
               if (xmlReader.Name == "XXX")
               {
                   if (xmlReader.Read() && xmlReader.NodeType == XmlNodeType.Text)
                   {
                       xxx = xmlReader.Value;
                    }

                }

           }

          By SeeSea

          posted @ 2008-07-19 23:09 SeesSea 閱讀(282) | 評論 (0)編輯 收藏

          僅列出標題  
          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          導航

          統計

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 井研县| 宝兴县| 颍上县| 科技| 长垣县| 钟山县| 梅河口市| 沅江市| 澄迈县| 澎湖县| 毕节市| 丹江口市| 来宾市| 宣化县| 班玛县| 紫金县| 平舆县| 鄂温| 无锡市| 丹棱县| 深泽县| 张家界市| 清河县| 武平县| 延安市| 惠安县| 桂林市| 隆尧县| 拜泉县| 蕲春县| 阳西县| 永兴县| 鄂州市| 台前县| 原阳县| 大兴区| 长子县| 阿拉尔市| 卢氏县| 闸北区| 湟中县|