97国产精品,欧美在线综合,青青草视频免费在线观看http://www.aygfsteel.com/ytfei/zh-cnSun, 06 Jul 2025 17:34:26 GMTSun, 06 Jul 2025 17:34:26 GMT60ubuntu 安裝 jdk5http://www.aygfsteel.com/ytfei/archive/2010/07/18/326474.html飛翔飛翔Sun, 18 Jul 2010 14:29:00 GMThttp://www.aygfsteel.com/ytfei/archive/2010/07/18/326474.htmlhttp://www.aygfsteel.com/ytfei/comments/326474.htmlhttp://www.aygfsteel.com/ytfei/archive/2010/07/18/326474.html#Feedback0http://www.aygfsteel.com/ytfei/comments/commentRss/326474.htmlhttp://www.aygfsteel.com/ytfei/services/trackbacks/326474.html

飛翔 2010-07-18 22:29 發(fā)表評論
]]>
ubuntu 安裝字體http://www.aygfsteel.com/ytfei/archive/2010/07/18/326472.html飛翔飛翔Sun, 18 Jul 2010 14:05:00 GMThttp://www.aygfsteel.com/ytfei/archive/2010/07/18/326472.htmlhttp://www.aygfsteel.com/ytfei/comments/326472.htmlhttp://www.aygfsteel.com/ytfei/archive/2010/07/18/326472.html#Feedback0http://www.aygfsteel.com/ytfei/comments/commentRss/326472.htmlhttp://www.aygfsteel.com/ytfei/services/trackbacks/326472.html

飛翔 2010-07-18 22:05 發(fā)表評論
]]>
Ubuntu 安裝、卸載軟件的命令 apt-get/dpkghttp://www.aygfsteel.com/ytfei/archive/2010/07/18/326471.html飛翔飛翔Sun, 18 Jul 2010 14:04:00 GMThttp://www.aygfsteel.com/ytfei/archive/2010/07/18/326471.htmlhttp://www.aygfsteel.com/ytfei/comments/326471.htmlhttp://www.aygfsteel.com/ytfei/archive/2010/07/18/326471.html#Feedback0http://www.aygfsteel.com/ytfei/comments/commentRss/326471.htmlhttp://www.aygfsteel.com/ytfei/services/trackbacks/326471.html Ubuntu 安裝、卸載軟件的命令 apt-get/dpkg
更新軟件信息數(shù)據(jù)庫 apt-get update
進行系統(tǒng)升級 apt-get upgrade
搜索軟件包 apt-cache search softname1 softname2 softname3……

安裝軟件 apt-get install softname1 softname2 softname3……
卸載軟件 apt-get remove softname1 softname2 softname3……
卸載并清除配置 apt-get remove --purge softname1

安裝deb軟件包 dpkg -i xxx.deb
刪除軟件包 dpkg -r xxx.deb
連同 配置文件一起刪除 dpkg -r --purge xxx.deb

查看軟件包信息 dpkg -info xxx.deb
查看文件拷貝詳情 dpkg -L xxx.deb
查看系統(tǒng)中已安裝軟件包信息 dpkg -l
重新配置軟件包 dpkg-reconfigure xxx


飛翔 2010-07-18 22:04 發(fā)表評論
]]>
install (set up) linux ftp http://www.aygfsteel.com/ytfei/archive/2007/04/07/109047.html飛翔飛翔Fri, 06 Apr 2007 16:34:00 GMThttp://www.aygfsteel.com/ytfei/archive/2007/04/07/109047.htmlhttp://www.aygfsteel.com/ytfei/comments/109047.htmlhttp://www.aygfsteel.com/ytfei/archive/2007/04/07/109047.html#Feedback0http://www.aygfsteel.com/ytfei/comments/commentRss/109047.htmlhttp://www.aygfsteel.com/ytfei/services/trackbacks/109047.html
http://rimuhosting.com/howto/ftp.jsp


FTP (File Transfer Protocol) is a common way of moving files between computers.  By default your RimuHosting server will not have FTP enabled.

Do you really need to run FTP? For example, if you are going to be the only person moving files to and from your server, then you may not need it.  Try our scp howto instead.

To enable FTP, first edit the vsftpd.conf file (e.g. vi /etc/vsftpd/vsftpd.conf).  Then:

  • Consider changing anonymous_enable=YES to anonymous_enable=NO
  • Uncomment the "nopriv_user=ftpsecure" line
  • Uncomment the "write_enable=YES" line (else you'll get an error like '550 Permission denied.' from your FTP client when you upload a file or create a directory)
  • Uncomment the "local_enable=YES" line (else you'll get an error like '500 OOPS: vsftpd: both local and anonymous access disabled!')
  • Add a "chroot_local_user=YES" line. This will trap your FTP users in their own /home/username directory. Otherwise they will be able to see and update some files outside their home directory.

Then create a non-super user that vsftp will run as.  Note: this is not the FTP username you'll use when logging into your FTP server.


# create an unpriviledged user that will run the vsftpd service
adduser -s /sbin/nologin ftpsecure
sed --in-place 's/^anonymous_enable=YES/anonymous_enable=NO/ig' /etc/vsftpd/vsftpd.conf
sed --in-place 's/^anon_upload_enable=YES/anon_upload_enable=NO/ig' /etc/vsftpd/vsftpd.conf

Then, most redhat distributions you can then run:

chkconfig --level 35 vsftpd on && /etc/init.d/vsftpd start

Or, on a RedHat 8 distribution:


vi /etc/xinetd.d/vsftpd
# ... and change the disable = yes to disable = no

# then restart xinetd
/etc/init.d/xinetd restart

The ftp daemon will not let you log in as root (?why?).  Try a log in as a non-super user.  To create such a user:


# add the user, use the -s (shell) option if you do not want the
# user to be able to ssh into the server (else skip it)
adduser -s /sbin/nologin yourusername
passwd yourusername
# you will be prompted for a password
# now, log in to your ftp server using this username and password

Locking FTP Users Into Their Home Directories

By default FTP users can read and write files any files on the server, provided they have access to read/write those files.

You can also set things up so that FTP users only see files under their home directory.  This can often be a more secure setup.  To do this just add chroot_local_user=YES in vsftpd.conf (and restart vsftpd). e.g.


sed --in-place 's/^anonymous_enable=YES/anonymous_enable=NO/ig' /etc/vsftpd/vsftpd.conf
sed --in-place 's/^anon_upload_enable=YES/anon_upload_enable=NO/ig' /etc/vsftpd/vsftpd.conf
if ! test -e /etc/vsftpd/vsftpd.conf; then
echo /etc/vsftpd/vsftpd.conf not found
elif grep -qai chroot_local_user=YES /etc/vsftpd/vsftpd.conf; then
echo "chroot_local_user directive already existed"
else
echo "Adding the chroot_local_user directive"
echo "chroot_local_user=YES" >> /etc/vsftpd/vsftpd.conf
fi
/etc/init.d/vsftpd restart

When a user logs in, if there directory was /home/user/html, they would see /html. They're locked into /home/user, and /home/user becomes their root (/) directory.





飛翔 2007-04-07 00:34 發(fā)表評論
]]>
ant 的使用http://www.aygfsteel.com/ytfei/archive/2006/10/20/76397.html飛翔飛翔Fri, 20 Oct 2006 07:48:00 GMThttp://www.aygfsteel.com/ytfei/archive/2006/10/20/76397.htmlhttp://www.aygfsteel.com/ytfei/comments/76397.htmlhttp://www.aygfsteel.com/ytfei/archive/2006/10/20/76397.html#Feedback0http://www.aygfsteel.com/ytfei/comments/commentRss/76397.htmlhttp://www.aygfsteel.com/ytfei/services/trackbacks/76397.html轉自:http://www.csbus.com/forum/ShowDetail.asp?Ici_ID=849&ForumID=5&ForumName=%D4%B1%B9%A4%D6%AE%BC%D2


本文主要介紹 Ant 在多用戶開發(fā)的情況下,如何用 Eclipse,并且根據(jù)不同的目標環(huán)境編譯不同的部署包。文中首先介紹一個場景,給出在開發(fā)、編譯、部署過程中遇到的問題;然后介紹如何用 Eclipse 來簡化你的 Ant 開發(fā)過程;文章的最后解釋如何通過編寫有效的 Ant 腳本來提高你的工作效率。

讀者定位為具有 Java 和 Ant 使用經(jīng)驗的開發(fā)人員。

讀者可以學習到如何使用 Ant 解決一些多用戶開發(fā)環(huán)境中,根據(jù)不同的目標環(huán)境編譯成不同部署包的問題。

工作場景

現(xiàn)在有一個 web 項目,是多人進行開發(fā)的,通過 CVS 來管理。另外該項目還有一些測試人員,他們測試部署在測試服務器上的應用程序,發(fā)現(xiàn) bug 后通過 bug 管理系統(tǒng)通知開發(fā)人員,在開發(fā)人員修復 bug 并經(jīng)過本地測試后,由專門的人負責檢出(check out)代碼,編譯打包后部署到測試服務器上。

該項目的成員小A就是負責檢出代碼、編譯打包,并部署到服務器上的人。除了這個任務之外,他還是該項目的編程人員。在項目進入測試階段后,小A在得到組中別的成員修復了 bug 并且檢入(check in)了代碼的消息后(也有可能是小A自己檢入了代碼),小A首先更新本地的代碼,先在本地做測試,確認修復了 bug 后打成 WAR 包部署到測試服務器上,并通知測試人員已經(jīng)修復了 bug,讓測試人員繼續(xù)進行測試。

小A的煩惱

在該項目中,有一些為測試方便開發(fā)而寫的代碼和頁面,比如跳過用戶認證,但是在部署到測試機環(huán)境的時候,需要刪除這些代碼和頁面;另外作為一個具有靈活性和擴展性的應用程序,又有一些配置文件,配置文件中的值會根據(jù)環(huán)境的改變而變動。例如,在項目中使用了 Log4j 記錄日志,需要給 Log4j 指定日志文件的保存路徑,本地程序員開發(fā)的時候用的是 Windows 系統(tǒng),給 Log4j 指定的也是 Windows 的文件系統(tǒng),在測試階段的時候,需要部署到 Linux 系統(tǒng)中,那么日志的保存路徑也需要做相應的改動。部署到測試服務器上的時候,除了 Log4j 需要改之外,還有很多別的配置項目也需要變動,并且分散在各個 package 中。小A的煩惱也隨之而來,每次他在做完本地測之后,就根據(jù)測試機的需要逐個找配置文件,更改相應的值,并刪除那些為測試方便寫的代碼和頁面,每天可能根據(jù)需要做好幾次這樣的事情,最煩的是他在快做完對測試機環(huán)境更改的時候,某開發(fā)人員突然通知小A說:“我又改了一點代碼,剛檢入,你再重打一個包吧。”,小A又不得不從頭開始做新一輪的檢出代碼、本地測試、更改配置文件、刪除不需要的文件、打包部署的工作。另外小A在測試階段的后期被通知要求除了每次生成一個測試環(huán)境的 WAR 包外還必須生成一個在產(chǎn)品環(huán)境下的 WAR 包,他做的事情就更多了。

從上面的場景可以看出,小A的工作效率低而且容易出錯,甚至有可能導致整個項目的工作效率低下。其實可以通過 Ant 來幫助小A快速而且有效地完成這個工作。在 Ant 中,根據(jù)目標環(huán)境的需要,可以把所有要更改的配置文件的項目集中寫到某個配置文件中。這樣根據(jù)不同的目標環(huán)境得到不同的配置文件,Ant 在編譯包時根據(jù)不同的目標環(huán)境切換不同的配置文件即可。比如小A現(xiàn)在碰到的有 3 中環(huán)境:開發(fā)環(huán)境、測試環(huán)境以及產(chǎn)品環(huán)境,根據(jù)這三種環(huán)境可以生成三個不同的配置文件:develop_deploy.property、test_deploy. property和product_deploy. property,當小A想生成不同的包時只需在這三個配置文件之間切換就可以了。

在正式開始編寫腳本之前,我們需要下載安裝相應的軟件。

  • Eclipse:為了使 Ant 的開發(fā)更加簡單,我們選擇了 Eclipse3.1 作為開發(fā)環(huán)境。當然你可以使用任何你喜歡的文本編輯工具來開發(fā)你的 Ant。Eclipse 的最新版本可以在 http://eclipse.org/ 上下載。
  • Ant:Ant 是基于 Java 的編譯工具,它就像 C/C++ 中的 make,但是沒有 make 那樣難用。Ant 的最新版本可以在 http://ant.apache.org/bindownload.cgi 上下載。如果你用 Eclipse 來開發(fā) Ant,則不用去單獨下載 Ant,因為在 Eclipse 中已經(jīng)集成了 Ant。
  • CVS 客戶端(cvs.exe):CVS 可以在 http://www.nongnu.org/cvs/ 上下載




回頁首


用 Eclipse3.1 來創(chuàng)建 Ant 腳本

如果你使用 Eclipse 來編寫 Ant,建議使用 Eclipse 3.1 以后的版本。除了以前 Ant 編輯器提供的語法高亮,提示語法錯誤等功能外,Eclipse3.1 版本增加了許多新的功能。比如:腳本代碼的折疊;快速定位某屬性或者目標(target)段的定義;在同一 builder 文件中重構屬性名和目標名(快捷方式Alt + Shift +R);調(diào)試 Ant 腳本等。

下面我們就來看看 Eclipse 3.1 中對 Ant 的支持

  • 打開“File”-“New”-“Project”-“Simple”-“Project”,點擊“Next”,輸入工程名“Ant”,然后點擊直到“Finish”

  • 在新建的 Ant 工程中,新建 Test.xml,并且拷貝下面的腳本。該段腳本的內(nèi)容就不做介紹了,我們主要看 Eclipse 提供了哪些功能。注意這時候打開的并不是 Ant 編輯器,將內(nèi)容拷貝進去之后,關掉打開的“Test.xml”,然后再重新打開它,這樣 Eclipse 就會用 Ant 編輯器打開它,并且也語法高亮了。

    <?xml version='1.0' encoding='UTF-8'?>
    <project name='Test' default='init' basedir='.'>
    <property name='test' value='test'/>
    <target name='init'>
    	<echo>${test}</echo>
    </target>
    </project>
    

  • 自動提示和代碼折疊功能。如果是 Ant 內(nèi)置的命令或者前面已經(jīng)定義的變量,編輯器會自動提示;編輯器右邊的加/減號可以代碼折疊。如下所示:

    圖1:編輯器右邊的加/減號可以代碼折疊
  • 快速定位目標(target)或者定義變量處。在上圖中,將鼠標移至 default=”init” 中的 init 上之后,按下 ctrl 鍵,鼠標變成手狀,單擊就可以定位到定義該目標的地方

  • 快速重構目標名或者屬性名。選中目標/屬性名,按下 Alt + Shift + R,然后鍵入你要修改后的值,所有引用到的地方都會隨之改動。如下圖所示,選中 init 后,按下快捷鍵,改成 initial:

    圖2:改成 initial
  • 調(diào)試 Ant 腳本。在標簽“<target name=..”的左邊設置一斷點,然后在編輯器中右擊,出現(xiàn)的菜單中選“Debug As”-“Ant Build”,出現(xiàn)后的窗口與調(diào)試 Java 程序的界面差不多。

    這是調(diào)試窗口,這里可以選擇單步跟進、跳出等:

    圖3:選擇單步跟進、跳出等

    下面是運行時變量窗口。可以看到 test 變量的值是“test”:

    圖4:test 變量的值是 test

    運行結果窗口:

    圖5:運行結果窗口

由此可見,如果使用好 Eclipse Ant 編輯器所提供強大的功能的話能大大提高寫 Ant 腳本的效率。





回頁首


Ant 中使用 property(屬性)文件

剛開始寫 Ant 的初學者可能會把所有的信息都放在 build.xml 中,下面就是這樣的一個例子。

<project name='testBuild' default='compile' basedir='.'>
<target name='init'>
	<mkdir dir='c:/temp/dest/testProj' />
</target>
<target name='compile' depends='init'>
	<javac srcdir='c:/temp/src/testProj' destdir='c:/temp/dest/testProj '/>
<echo>Build into c:/temp/dest/testProj, successfully.</echo>
</target>
</project>

在上面的例子中,所有的路徑信息都是寫在 build.xml 中。但是 Ant 腳本可能在不同的機器或者不同的系統(tǒng)上運行,也有可能一些值需要根據(jù)環(huán)境的不同而變化,在 Ant 中可以把所有這些可能變化的地方都放到一個配置文件中,然后在 Ant 腳本中引用這個配置文件就可以了,針對上面的例子,如下所示:

<project name='testBuild' default='compile' basedir='.'>
	<property file='build.properties'/>
	<target name='init'>
		<mkdir dir='${dest.dir}' />
	</target>
	<target name='compile' depends='init'>
		<javac srcdir='${src.dir}' destdir='${dest.dir}'/>
		<echo>Build into ${dest.dir}, successfully.</echo>
	</target>
</project>
build.properties的內(nèi)容:
dest.dir=c:/temp/dest/testProj
src.dir=c:/temp/src/testProj

如果想在 Ant 腳本中引用值的話,只需用$符號開頭,在一對'{}'中寫入要引用的鍵值。如上例中,需要引用編譯的目標路徑用'${dest.dir}'。





回頁首


使用 Ant 任務從 CVS 中檢出(check out)源代碼,并編譯打包

Ant 中提供了 cvs 任務(Task)可以從 CVS 服務器中檢出資源(注意:在使用 Ant 的 cvs 任務之前,請先將 cvs.exe 下載到你的機器,并且將它添加到你本地的 PATH 環(huán)境變量中,然后重新啟動 Eclipse。否則在執(zhí)行下面腳本的時候就會得到 error=2 的錯誤)。cvs 的可選用屬性很多,在這里介紹經(jīng)常使用到的幾個屬性。從 CVS 中檢出資源一般需要指定:

  • CVS 所在的服務器地址:目標 CVS 服務器地址
  • 用戶名:登錄該 CVS 服務器你指定的用戶名
  • 密碼:登錄該 CVS 服務器需要的密碼
  • 庫路徑(Repository Path):服務器中的庫路徑
  • 模塊名:當前需要檢出的模塊名,一般都是以工程的名字作為模塊名
  • 標簽名:需要從 CVS 中檢出哪個標簽

在介紹使用 Ant 的 cvs 之前,先說一下本地的目錄結構。在 C 盤的 temp 目錄下,分別有四個目錄,如下所示:

  • build 目錄:放編譯后的類以及資源文件
  • dist 目錄:放生成的 jar 文件或者 war 文件
  • lib 目錄:放在編譯過程中需要用到的 jar 文件
  • src 目錄:放從 cvs 中檢出的源文件(包括 JSP 等)
    圖6:src 目錄

在 Ant 中這樣寫就可以從中檢出資源:

  <cvs cvsRoot=':pserver:username:pwd@cvs.server:/home/testPath' 
package='TestProj' dest=' c:/temp/src/testProj ' failonerror='true' />

這段腳本片斷的意思就是從叫'cvs.server'的服務器中,用用戶名是 username、密碼為 pwd 的用戶檢出在庫路徑是 /home/testPath 下的 TestProj 模塊(項目),檢出后的資源放入本地目錄 c:/temp/src/testProj 中。在上面這段腳本中,可以看到有很多值可能會根據(jù)不同的環(huán)境或者用戶隨之改變的,比如用戶名和密碼等;而且從腳本的重復可利用性來說,需要把有些值抽出來放到配置文件中,如服務器的地址和庫路徑等。因此把這些可能需要更改的地方放到 property 文件中,效果會更好。改完后的完整 Ant 腳本如下所示:

  <?xml version='1.0'?>
<project name='testWeb' default='checkout' basedir='.'>
	<target name='checkout'>
		<property file='TestWeb.properties' />
		<cvs cvsRoot='${cvs.root}' package='${cvs.projectName}' 
tag='${cvs.tag}' dest='${src.dir}' failonerror='true' />
	</target>
</project>

對應的 TestWeb.properties 文件內(nèi)容如下所示:

base.dir=c:/temp/
src.dir=${base.dir}/src

cvs.server=cvs.server
cvs.user=username
cvs.pw=pwd
cvs.repositoryPath=/home/testPath
cvs.projectName=TestProj
cvs.root=:pserver:${cvs.user}:${cvs.pw}@${cvs.server}:${cvs.repositoryPath}
cvs.tag=

在檢出了資源后,需要對其進行編譯打包。為了使 Ant 腳本更加具有可讀性和靈活性,我們需要對上面的 Ant 腳本進行一些改動。首先將 Ant 腳本中進行分段,如下所示:

<?xml version='1.0'?>
<project name='testWeb' default='all' basedir='.'>
	<target name='all' depends='init,clean,checkout,build'>
    <!--腳本的入口點-->
	</target>
	<target name='init'>
    <!--做初始化屬性文件和設置classpath等設置初始條件-->
	</target>
	<target name='clean'>
     <!--刪除上一次留下的沒用的目錄和文件-->
	</target>
	<target name='checkout'>	
     <!--從CVS中檢出資源-->
	</target>
	<target name='build'>
     <!--編譯源文件并打包到指定的目錄-->
	</target>
</project>

上面的腳本中,總共分成了5個目標(target),腳本的入口點是'all',all 按順序調(diào)用 init,clean,checkout,build。其中:

  • init 是用來做初始化屬性文件和設置 classpath 等設置初始條件的事情
  • clean 用來刪除上一次留下的沒用的目錄和文件
  • checkout 已經(jīng)介紹過了,是用來從 CVS 中檢出資源
  • build 用來編譯源文件并打 WAR 包到指定的目錄

詳細的 Ant 腳本可以參見隨本文所附的 TestWeb.xml 和 TestWeb.properties。





回頁首


編譯過程與產(chǎn)生不同目標環(huán)境的腳本分開執(zhí)行

在前面介紹的 Ant 腳本中,根據(jù)從 CVS 服務器中檢出的資源打成了一個默認的 war 包,并沒有考慮根據(jù)不同的目標環(huán)境來生成不同的包,從下一節(jié)開始介紹如何根據(jù)不同的環(huán)境來生成不同的部署包。

還有一個問題是:為什么需要把從 CVS 中檢出資源、編譯的過程跟根據(jù)目標環(huán)境打包的過程分開?

這是因為本身 CVS 檢出資源是需要花一定的時間,如果資源比較多這個過程就會花費挺長時間;另外,在多人開發(fā)的情況下必須保證在生成不同的部署包的時候是用的是同一套代碼生成的,否則會出現(xiàn)各個服務器上運行的版本不一致,如果檢出資源、編譯的過程跟生成包的腳本一起執(zhí)行的話就會出現(xiàn)這個問題(比如小A在測試服務器測試通過的時候之后,再生成一個在產(chǎn)品環(huán)境下的部署包,如果分兩次從 CVS 服務器中檢出資源的話,在此期間可能會有開發(fā)人員往 CVS 服務器中檢入代碼,導致生成的版本不一致),因此,必須將這兩個過程分開執(zhí)行。現(xiàn)在我們開始建立另外一個 Ant 腳本文件,叫 deploy.xml,專門用來生成包;另外與 deploy.xml 相對應的還有一個 deploy.properties 文件。在 deploy.xml 中會引用 deploy.properties 文件。另外根據(jù)在前面的場景中碰到的環(huán)境,創(chuàng)建三個不同的屬性文件, develop_deploy.property、test_deploy. property 和 product_deploy. Property,在打包的時候,根據(jù)不同的目標環(huán)境,將相應屬性文件中的內(nèi)容拷貝至 deploy.properties 文件中(或者也可以直接在 deploy.xml 中直接切換不同的屬性文件),然后在 Eclipse 中直接執(zhí)行 deploy.xml;如果在命令行中,可以用下面的命令來執(zhí)行:

  ant –f deploy.xml





回頁首


解開 WAR 包

我們首先得建立一個目錄(這里是 unpack)用來存放解壓后的文件。Ant 中提供了 unzip 命令用來解壓 ear/war/jar 包。除了這個目錄外,根據(jù)不同的目標環(huán)境,在運行目錄下建立一個與目標環(huán)境相對應的目錄,重新打好的 war 包就放在這個目錄下,比如針對場景中的情況,如果需要創(chuàng)建一個產(chǎn)品環(huán)境下的部署包,我們可以建立一個 TestWebProduct 目錄,目錄名寫在配置文件中(${pack.base.dir})。

  <target name='init'>
		<echo>init in deploy</echo>
		<property file='deploy.properties' />
		<delete dir='${unpack.base.dir}' failonerror='false' />
		<delete dir='${pack.base.dir}' failonerror='false' />
		<mkdir dir='${unpack.base.dir}' />
		<mkdir dir='${pack.base.dir}' />
	</target>

	<target name='unpack'>
		<echo>unpack the ${war.name}</echo>
		<copy file='${dest.dir}/${war.name}' todir='${unpack.base.dir}' />
		<unzip src='${unpack.base.dir}/${war.name}' dest='${unpack.base.dir}/${projectName}' />
		<delete file='${unpack.base.dir}/${war.name}' />
	</target>

在 init 段中首先刪除掉上次解壓的目錄和目標打包目錄,然后重新建立目錄;在 unpack 中,首先將編譯好的默認 war 包拷貝至 unpack 定義的目錄,解壓之后把 unpack 下的 war 包刪除。下面是這時候對應的屬性文件。

projectName=MTSWeb
war.name=MTSWeb.war

#根目錄
base.dir=c:/temp
#默認的war包所在的目錄
dest.dir=${base.dir}/dist
#解壓后的目錄
unpack.base.dir=${base.dir}/unpack
#目標環(huán)境相對應的目錄
pack.base.dir=${base.dir}/TestWebProduct





回頁首


利用 Ant 提供的 filter 任務替換屬性值

現(xiàn)在根據(jù)不同環(huán)境的需要,對某些配置文件的值做一些替換。在 Ant 中,提供了 filter 任務,使得替換值很方便。當然也可以使用下面介紹的正則表達式來替換屬性值。filter 主要用來在同一行內(nèi)容中的替換,而正則表達式一下子可以替換多行內(nèi)容。filter 的使用例子:

  <filter token=' log4j.logger' value='INFO'/>
  <copy todir='${dest.dir}' filtering='true'>
    <fileset dir='${src.dir}'/>
  </copy>

這段腳本的意思就是在 src.dir 目錄下的所有文件中,如果有預先定義好的'@log4j.logger@'占位符的話,在拷貝到 dest.dir 目錄后,所有的占位符都被替換成了'INFO'。

你也可以將所有被替換的值放到某個屬性文件中,filter 任務將屬性文件中的每一個條目讀出來并且設置成一個 Filter。如下所示:

  <filter filtersfile='deploy_env.properties'/>
  <copy todir='${dest.dir}' filtering='true'>
    <fileset dir='${src.dir}'/>
  </copy>

上面的腳本表示所有在 deploy_env 中出現(xiàn)的條目將被作為一個 filter,在拷貝到 dest.dir 目錄后,所有 src.dir 目錄中存在的占位符將被替換成 deploy_env 中的值。具體的例子可以參見隨本文附帶的 deploy.xml, deploy_env.properties 和 Test.properties。

其中 deploy.xml 是 ant 腳本,deploy_env.properties 中包含所有要替換的值,在 Test.properties 中是包含有占位符的資源文件。





回頁首


利用正則表達式替換屬性值

Ant 中支持多種正則表達式,在運行 Ant 的時候用哪種正則表達式可以通過設置 ant.regexp.regexpimpl 的值來切換,Ant 支持的的正則表達式有:

  • java.util.regex package of JDK 1.4
  • jakarta-regexp
  • installation dependencies

正則表達式的例子:

<replaceregexp byline='true'>
<regexp pattern='正則表達式'/>
<substitution expression='將要替換的值'/>
<fileset dir='${unpack.war.dir}/WEB-INF' includes='web.xml'/>
</replaceregexp>

byline 屬性用來確認被替換的時候是一次替換一行還是多行;pattern 屬性用來指明正則表達式;substitution expression 中是替換的值,替換的值都定義在相對應的配置文件中;fileset 屬性中的 dir 用來指定被替換文件所在的目錄,includes 用來指定要替換哪個文件。需要注意的是,如果在正則表達式或者替換的值中出現(xiàn)'<'的話,需要用轉義符'<'。

在 Eclipse3.1 中已經(jīng)內(nèi)置了對正則表達式的支持;但是如果你在命令行中運行需要正則表達式支持的腳本的話,則需要自己將正則表達式的包下載下來加到 classpath 中。在隨文章的 deploy.xml 中提供了一個簡單的替換屬性文件的值的例子。正則表達式的例子可以在本文所帶的 deploy.xml 中找到。





回頁首


Ant 使用條件表達式,根據(jù)屬性值刪除不需要的文件

在生成部署包的時候,還有可能會根據(jù)目標環(huán)境的不同,刪除一些不同的文件。比如在產(chǎn)品環(huán)境中那些作為測試需要的代碼往往需要刪除,但是測試環(huán)境中并不需要。因此就需要條件表達式來做判斷。如下所示:

<target name='checkTestEnv'>
	<condition property='isTestEnv'>
		<istrue value='${deploy.isTestEnv}' />
	</condition>
	<antcall target='trueCondition' />
	<antcall target='falseCondition' />
</target>
<target name='trueCondition' if='isTestEnv'>
	<echo message='true condition in ${projectName}' />
</target>
<target name='falseCondition' unless='isTestEnv'>
	<echo message='false condition in ${projectName}' />
</target>

在上面的例子中,先讀出 ${deploy.isTestEnv} 的值(在配置文件 deloy.properties 中),根據(jù)讀出的值對屬性 isTestEnv 設值,如果 ${deploy.isTestEnv} 的值是 true,isTestEnv 的值也是 true;否則是 false。然后分別調(diào)用目標段 trueCondition 和 falseCondition。在這里,表達式值的判斷是用'istrue',在 Ant 中還提供了很多別的表達式,比如 not/and/or,equals 等等,具體關于條件表達式的信息可以參考:http://ant.apache.org/manual/CoreTasks/condition.html ,該頁也可以在隨下載下來的文檔中找到。

在段 trueCondition 中,判斷 isTestEnv,如果是真的話就運行,否則不運行;在段 falseCondition 中,也判斷 isTestEnv,如果是假就運行,否則不運行,在段中可以根據(jù)情況做相應的事情。條件判斷式的例子可以在本文的 deploy.xml 中找到。





回頁首


重新打包,并拷貝到不同的目錄

在上面的替換過程完成后,調(diào)用 war 將 unpack 目錄下的內(nèi)容重新打包。

<target name='repack'>
	<war destfile='${pack.base.dir}/${projectName}.war' 
		basedir='${unpack.base.dir}/${projectName}'
		webxml='${unpack.base.dir}/${projectName}/WEB-INF/web.xml' 
		manifest='${unpack.base.dir}/${projectName}/META-INF/MANIFEST.MF'>
	</war>
</target>

詳細的例子可以參見隨本文的附件 deploy.xml 和 deploy.properties。





回頁首


結論

通過本文可以看出編寫好有效的 Ant 腳本能很好的解決在編譯部署包的時候出現(xiàn)的問題,將那些變化的內(nèi)容放到配置文件中,在部署的時候切換不同的配置文件就可以實現(xiàn)生成不同的部署包。文中也介紹了如何使用 Eclipse 來提高你編寫/調(diào)試 Ant 腳本的效率。



飛翔 2006-10-20 15:48 發(fā)表評論
]]>
axis1.x開發(fā)webservices實例http://www.aygfsteel.com/ytfei/archive/2006/08/29/66500.html飛翔飛翔Tue, 29 Aug 2006 11:08:00 GMThttp://www.aygfsteel.com/ytfei/archive/2006/08/29/66500.htmlhttp://www.aygfsteel.com/ytfei/comments/66500.htmlhttp://www.aygfsteel.com/ytfei/archive/2006/08/29/66500.html#Feedback0http://www.aygfsteel.com/ytfei/comments/commentRss/66500.htmlhttp://www.aygfsteel.com/ytfei/services/trackbacks/66500.html
2、到 http://ws.apache.org/Axis/網(wǎng)站下載Axis安裝包

3、解壓縮安裝包,將Axis_UNZIP_PATH\Axis-version\webapps下的Axis包拷貝到TOMCAT_HOME\webapps\下,以下約定Axis_HOME為該TOMCAT_HOME\webapps\Axis目錄

4、啟動tomcat,訪問http://localhost:8080/Axis 檢查安裝是否成功

5、以上步驟執(zhí)行成功,可以開發(fā)webservice例子了

Axis支持三種web service的部署和開發(fā),分別為:

1、Dynamic Invocation Interface ( DII)

2、Stubs方式

3、Dynamic Proxy方式

二、編寫DII(Dynamic Invocation Interface )方式web服務

1.編寫服務端程序HelloClient

public class HelloClient
{
public String getName(String name)
{
return "hello "+name;
}
}


2、將源碼拷貝到Axis_HOME下,重命名為 HelloClient.jws

3、訪問連接http://localhost:8080/Axis/HelloClient.jws?wsdl,頁面顯示Axis自動生成的wsdl

4、編寫訪問服務的客戶端 TestHelloClient.java

import org.apache.Axis.client.Call;
import org.apache.Axis.client.Service;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;
import java.net.MalformedURLException;
import java.rmi.RemoteException;

public class SayHelloClient2
{
public static void main(String[] args)
{
try
{
String endpoint =
"http://localhost:8080/Axis/HelloClient.jws";

Service service = new Service();
Call call = null;

call = (Call) service.createCall();

call.setOperationName(new QName(
"http://localhost:8080/Axis/HelloClient.jws",
"getName"));
call.setTargetEndpointAddress
(new java.net.URL(endpoint));

String ret = (String) call.invoke(new Object[]
{"zhangsan"});
System.out.println("return value is " + ret);
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}


三、編寫Dynamic Proxy方式訪問服務

1、編寫部署服務端程序,同上邊DII方式,本次仍使用上邊部署的HelloClient

2、編寫代理接口

public interface HelloClientInterface
extends java.rmi.Remote
{
public String getName(String name)
throws java.rmi.RemoteException;
}


3、編寫并執(zhí)行客戶端程序TestHelloClient.java

import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceFactory;
import java.net.URL;
import javax.xml.namespace.QName;

public class TestHelloClient
{
public static void main(String[] args)
{
try
{
String wsdlUrl =
"http://localhost:8080/Axis/HelloClient.jws?wsdl";
String nameSpaceUri =
"http://localhost:8080/Axis/HelloClient.jws";
String serviceName = "HelloClientService";
String portName = "HelloClient";

ServiceFactory serviceFactory =
ServiceFactory.newInstance();
Service afService =
serviceFactory.createService(new URL(wsdlUrl),
new QName(nameSpaceUri, serviceName));
HelloClientInterface proxy = (HelloClientInterface)
afService.getPort(new QName(
nameSpaceUri, portName),
HelloClientInterface.class);
System.out.println
("return value is "+proxy.getName("john") ) ;
}catch(Exception ex)
{
ex.printStackTrace() ;
}
}
}


四、編寫wsdd發(fā)布web服務,編寫stub client訪問web服務

1、編寫服務端程序server,SayHello.java,編譯server.SayHello.java

package server;
public class SayHello
{
public String getName(String name)
{
return "hello "+name;
}
}
2.編寫LogHandler.java
import org.apache.Axis.AxisFault;
import org.apache.Axis.Handler;
import org.apache.Axis.MessageContext;
import org.apache.Axis.handlers.BasicHandler;

import java.util.Date;

public class LogHandler
extends BasicHandler
{
public void invoke
(MessageContext msgContext)
throws AxisFault
{
/** Log an access each time
we get invoked.
*/
try {
Handler serviceHandler
= msgContext.getService();

Integer numAccesses =
(Integer)serviceHandler.getOption("accesses");
if (numAccesses == null)
numAccesses = new Integer(0);
numAccesses = new Integer
(numAccesses.intValue() + 1);
Date date = new Date();
String result =
date + ": service " +
msgContext.getTargetService() +
" accessed " + numAccesses + " time(s).";
serviceHandler.setOption
("accesses", numAccesses);
System.out.println(result);
} catch (Exception e)
{
throw AxisFault.makeFault(e);
}
}
}


3、編寫wsdd文件

deploy.wsdd
<deployment xmlns=
"http://xml.apache.org/Axis/wsdd/"
xmlns:java=
"http://xml.apache.org/Axis/wsdd/providers/java">
<handler name="print" type="java:LogHandler"/>
<service name="sayhello"
provider="java:RPC">
<requestFlow>
<handler type="print"/>
</requestFlow>
<parameter name="className"
value="server.SayHello"/>
<parameter name="allowedMethods"
value="*"/>
</service>
</deployment>


3、將編譯后的文件拷貝到Axis_HOME/WEB-INF/classes下,如:D:\tomcat\webapps\Axis\WEB-INF\classes

4、發(fā)布服務:

java org.apache.Axis.client.AdminClient deploy.wsdd

5、生成client stub文件

a:方式1

將SayHello.java拷貝到Axis_HOME/下,重命名為SayHello.jws,

執(zhí)行下面的命令生存client stub

java org.apache.Axis.wsdl.WSDL2Java 
-p client http://localhost:8080
/Axis/services/SayHello.jws?wsdl


b:方式2

執(zhí)行如下命令生成SayHello.wsdl

java org.apache.Axis.wsdl.Java2WSDL
-oSayHello.wsdl -lhttp://localhost:8080
/Axis/services/SayHello -nsayhello server.SayHello


執(zhí)行如下命令生成client stub

java org.apache.Axis.wsdl.WSDL2Java 
SayHello.wsdl -p client


生成的stub client文件列表為:

1.SayHello.java

2.SayHelloService.java。

3.SayHelloServiceLocator.java

4.SayHelloSoapBindingStub.java

6、編寫客戶端程序,編譯并執(zhí)行

public class SayHelloClient
{
public static void main(String[] args)
{
try
{
SayHelloService service = new client.
SayHelloServiceLocator();
client.SayHello_PortType
client = service.getSayHello();
String retValue=client.getName("zhangsan");
System.out.println(retValue);
}
catch (Exception e)
{
System.err.println
("Execution failed. Exception: " + e);
}
}
}


(T117)


飛翔 2006-08-29 19:08 發(fā)表評論
]]>
用J2EE開發(fā)WebService :轉http://www.aygfsteel.com/ytfei/archive/2006/08/17/64215.html飛翔飛翔Thu, 17 Aug 2006 14:16:00 GMThttp://www.aygfsteel.com/ytfei/archive/2006/08/17/64215.htmlhttp://www.aygfsteel.com/ytfei/comments/64215.htmlhttp://www.aygfsteel.com/ytfei/archive/2006/08/17/64215.html#Feedback0http://www.aygfsteel.com/ytfei/comments/commentRss/64215.htmlhttp://www.aygfsteel.com/ytfei/services/trackbacks/64215.html

用J2EE開發(fā)WebService


(by huihoo.com donyoung , Allen制作) WebServie討論>>>

英文原文:http://www.theserverside.com/resources/article.jsp?l=WebServices-Dev-Guide


I. 概要

基于XML的Web服務是參照B2B通信協(xié)作模式制定的新的規(guī)范。它提供了概念上和結構上的,適用于各種不同平臺和產(chǎn)品的基礎。現(xiàn)在,開發(fā)者可以利用J2EE技術來開發(fā)基于XML的Web服務。他們可以利用現(xiàn)存的J2EE技術來開發(fā)完整的,遵從XML標準的,能完全共通的WEB服務。無需重新設計或者構造現(xiàn)有的J2EE系統(tǒng),開發(fā)人員就可以構建復雜的強大的Web服務應用。

II. 介紹 Web服務是一種可以接收從Internet或者Intranet上的其它系統(tǒng)中傳遞過來的請求,輕量級的獨立的通訊技術。這種技術允許網(wǎng)絡上的所有系統(tǒng)進行交互。隨著技術的發(fā)展,一個Web服務可以包含額外的指定功能并且可以在多個B2B應用中協(xié)作通訊。

Web服務正在不斷完善,并且以一種非常智能的動態(tài)的方法來進行。這些靈活的Web服務可以理解請求中上下文的關系,并且在每一個特定的情況下產(chǎn)生動態(tài)的結果。這些服務會根據(jù)用戶的身份,地點以及產(chǎn)生請求的原因來改變不同的處理,用以產(chǎn)生一個唯一的,定制的方案。這種協(xié)作機制對那些只對最終結果有興趣的用戶來說,是完全透明的。

這種Web服務所遵循的XML標準可以增進事物通信的性能。開發(fā)人員將可以利用不同的平臺,產(chǎn)品和標準來實現(xiàn)很多種可能。通過這種標準,開發(fā)人員可以建立一個系統(tǒng)使他們的Web服務提供最大的協(xié)同工作的能力。

這份白皮書描述了如何方便地利用Java和XML技術來實現(xiàn)Web服務構架。它說明了Web服務中的每一個關鍵部分以及如何使他們結合在一起。你將會對基于XML的Web服務的結構以及如何與J2EE結合,有一個更加深入的了解我們從如何利用J2EE建立Web服務開始。這部分將使你對如何建立一個Web服務有一個了解。

III. 總結 一般來說,在不同的事務之間進行電子通信協(xié)作會有很多阻礙。全異的系統(tǒng),安全限制和不相同的數(shù)據(jù)格式,導致很多B2B系統(tǒng)在他們自己的領域或者客戶群中形成唯一。Web服務將改變這一切,使不同的事務互相通信變?yōu)榭赡埽档米⒁獾氖牵@會降低建立商業(yè)站點的開發(fā)和維護成本。

在建立Web服務的時候,有三個主要步驟:

1. 建立客戶端聯(lián)接 為了允許Applets,Applications,商業(yè)合作伙伴,瀏覽器和PDAs 使用Web服務。

2. 實現(xiàn)Web服務 包括工作流,數(shù)據(jù)傳送,商業(yè)邏輯以及數(shù)據(jù)訪問。這些功能是隱藏在Web服務后,并且為客戶端工作的。

3. 聯(lián)接后臺系統(tǒng) 這個系統(tǒng)可能包括一個或多個數(shù)據(jù)庫,現(xiàn)存的企業(yè)信息系統(tǒng),商業(yè)合作伙伴自己的系統(tǒng)或者Web服務,以及在多個系統(tǒng)中共享的數(shù)據(jù)。

你可以利用J2EE來實現(xiàn)這三個目標。用J2EE開發(fā)Web服務基于以下兩個技術:

XML 技術.
在Web服務中,XML標準是非常重要的。XML是一種數(shù)據(jù)格式,它可以以一種連貫的方式來表現(xiàn)數(shù)據(jù),并且可以在網(wǎng)絡中以點對點的形式傳送。這些不同的XML標準連同指定的處理方法是設計來支持特定的行為的。

Java 技術.
Developers開發(fā)人員利用 J2EE APIs來創(chuàng)建事務和表現(xiàn)的邏輯,訪問XML文檔,以及對XML文檔進行操作。信任被證實可行的Java技術是非常重要的,因為它允許開發(fā)者利用現(xiàn)有的下部構造,在其上構建新的功能。開發(fā)者可以繼續(xù)利用J2EE的標準API以及各種優(yōu)秀的組件來開發(fā)系統(tǒng)。現(xiàn)在,開發(fā)者可以利用J2EE中提供的Java API for XML Parsing (JAXP) 來開發(fā)Web服務,我們將在稍后介紹。這個新的APIs主要用來處理XML數(shù)據(jù)格式以及服務,將使開發(fā)變得更容易,效率更高。
圖 1 表現(xiàn)了基于J2EE的Web服務的核心構架。請注意,很多APIs在這里并沒有全部表示出來,象用來解析或者傳送消息的。但是,那些基于J2EE的標準,協(xié)議以及主要的子系統(tǒng)都表示出來了。

圖 1讓我們進一步看一下利用J2EE來創(chuàng)建Web服務的細節(jié)。

IV. 客戶端聯(lián)接

客戶端聯(lián)接是關于Web服務的使用者如何來使用你的系統(tǒng)。表格 1 顯示了三種主要使用系統(tǒng)的客戶。

客戶類型樣例如何聯(lián)接
商業(yè)合作伙伴代理商,客戶群基于XML的Web 服務技術 (SOAP, UDDI, WSDL, ebXML)
瘦客戶端瀏覽器,PDAs,無線設備HTTP 協(xié)議
胖客戶端應用小程序,應用程序,已經(jīng)存在的系統(tǒng)IIOP協(xié)議

表格 1商業(yè)合作伙伴的聯(lián)接

第一種訪問Web服務的客戶類型是商業(yè)合作伙伴。他們可能使用很多種類型的編程語言,中間件或者硬件。當他們訪問尼的系統(tǒng)的時候,Web服務要求返回一個XML文件。這個文件具有標準的標記來表示商業(yè)數(shù)據(jù),并且允許不同的系統(tǒng)通過這個來交互。

Java Servlets

當一個商業(yè)合作伙伴向Web服務發(fā)布一個請求的時候,接收請求的是一個Java servlet. 這個Servlet是一個在管理容器中運行,負責接收請求和響應的Java對象。它可以以很多種協(xié)議返回請求結果,象HTTP, FTP或者POP。在這個例子中Servlet通常使用HTTP來響應請求,這樣的話,Web服務就可以利用HTTP來通過防火墻了。

當一個請求到達J2EE Web服務的時候,以下操作會發(fā)生,見圖2

1. Java servlet接收XML 文檔。

2. Servlet 處理傳入的基于XML的請求

3. Servlet調(diào)用一個或者多個Enterprise JavaBeans (EJB) 組件來處理數(shù)據(jù)。

4. EJB組件進行他們自己的處理,可能會調(diào)用其他存在的系統(tǒng)。

5. EJB 組件把結果返回給Servlet。

6. Servlet 把結果匯集到XML文檔中。

7. Servlet 把XML傳送到客戶端。

圖 2為了實現(xiàn)商業(yè)合作伙伴的聯(lián)接,必須有一種方法來發(fā)布,描述,定位以及調(diào)用一個Web服務。我們現(xiàn)在來描述如何達到這個目的。

UDDI 在用戶能夠調(diào)用Web服務之前,必須確定這個服務內(nèi)包含哪些商務方法,找到被調(diào)用的接口定義,還要在服務端來編制軟件。所以,我們需要一種方法來發(fā)布我們的Web服務。

UDDI (Universal Description, Discovery, and Integration) 是一個主要針對Web服務供應商和使用者的新項目。UDDI 項目中的成員可以通過UDDI Business Registry (UBR) 來操作Web服務的調(diào)用,UBR是一個全球性的服務。Web服務供應商可以在UBR中描述并且注冊他們的服務。用戶可以在UBR中查找并定位那些他們需要的服務。

UDDI是一種根據(jù)描述文檔來引導系統(tǒng)查找相應服務的機制。UDDI包含標準的"白皮書"類型的商業(yè)查詢方式,"黃皮書"類型的局部查找,以及"綠皮書"類型的服務類型查找。"綠皮書"允許開發(fā)者精確查找符合服務類型的所有服務。(這一段翻的比較奇怪)

UDDI利用SOAP消息機制(標準的XML/HTTP)來發(fā)布,編輯,瀏覽以及查找注冊信息。它采用XML格式來封裝各種不同類型的數(shù)據(jù),并且發(fā)送到注冊中心或者由注冊中心來返回需要的數(shù)據(jù)。

JAXR

為了支持UDDI在Java平臺上的功能,Java APIs for XML Registries (JAXR)允許開發(fā)者來訪問注冊中心。值得注意的是,JAXR并不是建立Web服務必需的,你可以利用其他常用的XML APIs來直接集成這些協(xié)議。JAXR是一個方便的API,它提供了Java API來發(fā)布,查找以及編輯那些注冊信息。它的重點在于基于XML的B2B應用,復雜的地址本查找以及對XML消息訂閱的支持等Web服務。它也可以用來訪問其他類型的注冊中心,象ebXML注冊中心(稍候描述)。

這些對Web服務的注冊信息進行的操作,可以使用當前的一些Web服務工具來完成(例如第三方的SOAP和ebXML消息工具)。另外,當JAXP提供了一致并具有針對性的API來完成這些操作,這將使開發(fā)變得更加容易。

WSDL

對于商業(yè)用戶來說,要找到一個自己需要使用的服務,他必須知道如何來調(diào)用。WSDL (Web Services Description Language) 規(guī)范是一個描述接口,語義以及Web服務為了響應請求需要經(jīng)常處理的工作的XML文檔。這將使簡單地服務方便,快速地被描述和記錄。

以下是一個WSDL的樣例:

<?xml version="1.0"?>
<definitions name="StockQuote"
??????????????? targetNamespace="http://example.com/stockquote.wsdl"
??????????????? xmlns:tns="http://example.com/stockquote.wsdl"
??????????????? xmlns:xsd1="http://example.com/stockquote.xsd"
??????????????? xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
??????????????? xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
?? <schema targetNamespace=http://example.com/stockquote.xsd
???????????????? xmlns="http://www.w3.org/2000/10/XMLSchema">
????? <element name="TradePriceRequest">
??????? <complexType>
?????????? <all>
??????????????? <element name="tickerSymbol" type="string"/>
????????????? </all>
?????????? </complexType>
??????? </element>
??????? <element name="TradePrice">
??????????? <complexType>
??????????????? <all>
?????????????????? <element name="price" type="float"/>
???????????????? </all>
????????????? </complexType>
?????????? </element>
??????? </schema>
???? </types>
???? <message name="GetLastTradePriceInput">
???????? <part name="body" element="xsd1:TradePriceRequest"/>
???? </message>
???? <message name="GetLastTradePriceOutput">
???????? <part name="body" element="xsd1:TradePrice"/>
??? </message>
??? <portType name="StockQuotePortType">
??????? <operation name="GetLastTradePrice">
??????????? <input message="tns:GetLastTradePriceInput"/>
??????????? <output message="tns:GetLastTradePriceOutput"/>
???????? </operation>
????? </portType>
????? <binding name="StockQuoteSoapBinding"
??????????????????? type="tns:StockQuotePortType">
???????? <soap:binding style="document"
???????????????????????????????? transport="http://schemas.xmlsoap.org/soap/http"/>
??????? <operation name="GetLastTradePrice">
??????????? <soap:operation
?????????????????????????? soapAction="http://example.com/GetLastTradePrice"/>
??????????? <input>
?????????????? <soap:body use="literal"/>
??????????? </input>
??????????? <output>
??????????????? <soap:body use="literal"/>
??????????? </output>
???????? </operation>
????? </binding>
???? <service name="StockQuoteService">
??????? <documentation>My first service</documentation>
??????? <port name="StockQuotePort" binding="tns:StockQuoteBinding">
??????????? <soap:address location="http://example.com/stockquote"/>
??????? </port>
???? </service>
? </definitions>

它包含了以下的關鍵信息:
· 消息的描述和格式定義可以通過XML文檔中的 標記來傳送。
· 標記中表示了消息傳送機制。 (e.g. request-only, request-response, response-only) 。
· 標記指定了編碼的規(guī)范 。
· 標記中表示服務所處的位置 (URL)。

WSDL在UDDI中總是作為一個接口描述文檔。因為UDDI是一個通用的用來注冊WSDL規(guī)范的地方,UDDI的規(guī)范并不限制任何類型或者格式描述文檔。這些文檔可能是一個WSDL文檔,或者是一個正規(guī)的包含導向文檔的Web頁面,也可能只是一個包含聯(lián)系信息的電子郵件地址。

現(xiàn)在Java提供了一個 Java API for WSDL (JWSDL)規(guī)范。它提供了一套能快速處理WSDL文檔的方法,并且不用直接對XML文檔進行操作,它會比JAXP更方便,更快速。

圖 3 顯示了如何使用WSDL 和 UDDI。



圖 3

SOAP

當商業(yè)用戶通過UDDI找到你的WSDL描述文檔后,他通過可以Simple Object Access Protocol (SOAP) 調(diào)用你建立的Web服務中的一個或多個操作。

SOAP是XML文檔形式的調(diào)用商業(yè)方法的規(guī)范,它可以支持不同的底層接口,象HTTP(S)或者SMTP。之所以使用XML是因為它的獨立于編程語言,良好的可擴展性以及強大的工業(yè)支持。之所以使用HTTP是因為幾乎所有的網(wǎng)絡系統(tǒng)都可以用這種協(xié)議來通信,由于它是一種簡單協(xié)議,所以可以與任何系統(tǒng)結合,還有一個原因就是它可以利用80端口來穿越過防火墻。 SOAP的強大是因為它簡單。SOAP是一種輕量級的,非常容易理解的技術,并且很容易實現(xiàn)。它有工業(yè)支持,可以從各主要的電子商務平臺供應商那里獲得。

從技術角度來看,SOAP詳細指明了如何響應不同的請求以及如何對參數(shù)編碼。一個SOAP封裝了可選的頭信息和正文,并且通常使用HTTP POST方法來傳送到一個HTTP 服務器,當然其他方法也是可以的,例如SMTP。SOAP同時支持消息傳送和遠程過程調(diào)用。以下是一個SOAP請求。

POST /StockQuote HTTP/1.1
Host: www.stockquoteserver.com
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
SOAPAction: "Some-URI"

<SOAP-ENV:Envelope
??? xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
??? SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
??? <SOAP-ENV:Header>
??????? <t:Transaction xmlns:t="some-URI" SOAP-ENV:mustUnderstand="1">
?????????? 5
??????? </t:Transaction>
??? </SOAP-ENV:Header>
??? <SOAP-ENV:Body>
??????? <m:GetLastTradePrice xmlns:m="Some-URI">
??????????? <symbol>SUNW</symbol>
??????? </m:GetLastTradePrice>
??? </SOAP-ENV:Body>
</SOAP-ENV:Envelope>


JAX/RPC

為了使開發(fā)人員專注于建立象SOAP那樣的基于XML的請求,JCP正在開發(fā)基于RPC (JAX/RPC) 的Java API。JAX/RPC是用來發(fā)送和接收方法調(diào)用請求的,它基于XML協(xié)議,象SOAP,或者其他的象XMLP (XML Protocol,要了解更多可以參考http://www.w3.org/2000/xp/)。JAX/RPC使你不用再關注這些協(xié)議的規(guī)范,使應用的開發(fā)更快速。不久,開發(fā)人員就不用直接以XML表示方法調(diào)用了。

目前有很多第三方實現(xiàn)了SOAP,開發(fā)人員可以在不同的層次上調(diào)用SOAP,并選擇使用哪一種。將來,JAX/RPC會取代這些APIs并提供一個統(tǒng)一的接口來構造以及處理SOAP RPC請求。

在接收一個從商業(yè)伙伴那里過來的SOAP請求的時候,一個Java servlet用JAX/RPC來接收這個基于XML的請求。一旦接收到請求后,servlet會調(diào)用商務方法,并且把結果回復給商業(yè)伙伴。

ebXML 對于具有高擴展性的商業(yè)交易來說,他們需要一種可信任的結構來實現(xiàn)商業(yè)事務,多請求的事務,計劃以及文檔流程,應用的需求經(jīng)常超越了基于純SOAP的實現(xiàn)。因為SOAP只是提供了一個底層的結構,而你可能需要一個更高級的框架結構。

ebXML就是為了這個目的的,它是一套處理B2B應用間的合作與通信的XML規(guī)范。以下是ebXML中的關鍵組件:

Collaboration Protocol Profile (CPP)

CPP提供了一種標準并且簡單的方法描述了公司提供的產(chǎn)品。另外,它還描述了消息交換的能力以及公司支持的商務合作。它也描述了公司的商務處理方法,包括合伙人如何與公司合作。CPP定義了B2B交易中雙方的商務協(xié)作。例如,它同時定義了買賣雙方的商務處理方法。

Collaboration Protocol Agreement (CPA)

CPA描述了兩個公司之間進行交易時的詳細需求以及機制。它包含有由手工或者自動從經(jīng)過買賣雙方認可的CPPs中的信息。這個CPA是雙方進行指定交易的合約。 CPP和CPA的樣例,以及關于規(guī)范的細節(jié)可以從以下網(wǎng)站獲得:

http://ebxml.org/project_teams/trade_partner/cpp-example.xml
http://ebxml.org/project_teams/trade_partner/cpa-example.xml
http://www.ebxml.org/specs/ebCCP.pdf

Business Process and Information Modeling

ebXML還以XML的形式描述了商業(yè)事務處理的規(guī)范。它包括交易,文檔流程,數(shù)字通信,數(shù)據(jù)封裝格式以及其他更多。這些規(guī)范是用來建立CPPs,描述以及共享商業(yè)事務和信息時用的。

Core Components

ebXML中另外一個重要的部分是一系列的XML標記,我們叫它核心組件。這些標記包含了商務數(shù)據(jù),象日期,稅,賬戶,交易合同以及其他的。它指明了商業(yè)合約和實體,但對每個不同的行業(yè),可能都不一樣。

Messaging

ebXML消息格式包含了所有相關的消息導向信息(同步或者異步,可靠性)。一般來說,一個ebXML消息包含了CPA中的可視化內(nèi)容,并強制執(zhí)行交易規(guī)則。 EbXML是建立在SOAP消息封裝機制上的。它擴展了SOAP的協(xié)議,增加了多層框架結構來支持附件,安全性以及傳送的可靠性。

Registry/Repository

EbXML注冊中心是存儲CPPs, CPAs, ebXML核心組件和與ebXML相關的文檔的服務。它具有強大的查詢功能,允許用戶查找相關的組件以及發(fā)掘潛在客戶。JAXR API也可以用來訪問ebXML注冊中心。商業(yè)服務定義了CPPs,并且被存儲在ebXML注冊中心,然后發(fā)布到UDDI中。一個關鍵的概念是,UDDI提供了一個全球唯一的Web服務的描述信息,但那些真實的信息,還是保存在本地的ebXML庫中。這樣的話,一個潛在的客戶首先到UDDI中查找相關內(nèi)容,然后根據(jù)這些到ebXML庫中找CPPs或者其他相關文檔。

JAXM

當從商業(yè)合作伙伴那里接收一個Web服務的請求時,我們需要Java API實現(xiàn)一個Servlet來處理ebXML消息,就象我們用JAX/RPC來處理SOAP請求一樣。

Java API for XML Messaging (JAXM)

是集成XML消息標準(象ebXML消息或者SOAP消息)的規(guī)范。這個API是用來推動XML消息處理的,它檢測那些預定單的消息格式以及約束。它控制了所有的消息封裝機制,用一種直觀的方式分割了消息中的信息,象路由信息,發(fā)貨單。這樣,開發(fā)人員只要關注消息的有效負載,而不用去擔心那些消息的重復處理。

目前的開發(fā)人員用JAXP來實現(xiàn)JAXM將要提供的功能,JAXM將會提供一套非常具有針對性的API來處理基于XML的消息傳送。這將大大簡化開發(fā)人員的代碼,并使它們具有統(tǒng)一的接口。

JAXM和JAX/RPC的差別在于處理消息導向的中間件以及遠程過程調(diào)用的不同。JAXM注重于消息導向,而JAX/RPC是用來完成遠程過程調(diào)用的。以下是圖解。



圖 4

請注意,在JAXM 和 JAX/RPC技術成熟之前,開發(fā)人員還是依賴于第三方的SOAP APIs,象Apache SOAP, IdooXOAP, 以及 GLUE。當JAXM 和 JAX/RPC正式發(fā)布后,它將為當前不同的SOAP和ebXML消息提供統(tǒng)一的接口。就象JDBC位多種不同的數(shù)據(jù)庫提供統(tǒng)一的接口。

以上是對于讓商業(yè)合作伙伴訪問你的Web服務的討論。下面我們來討論瘦客戶端和胖客戶端。

Thin Client Connectivity

瘦客戶端(象瀏覽器或者無線設備)只對瀏覽頁面感興趣。Web服務的職責是執(zhí)行需要處理的Web請求,象運行B2C交易,然后給出訂單確認。為實現(xiàn)這個,開發(fā)者用JSP來寫動態(tài)頁面。JSP組件技術時一種可以根據(jù)后臺數(shù)據(jù)處理的結果,來動態(tài)生成頁面的技術。它們在提供JSP組件的容器中運行。 JSP可以表現(xiàn)后臺用各種方法來實現(xiàn)的業(yè)務邏輯(e.g. EJBs,普通的Java對象,或者標準的JavaBean)。它可以生成標準的HTML或者XHTML來顯示結果。 JSP組件與其說是可編程接口,不如說是用戶界面。比方說,一個股票報價服務可能需要調(diào)用一個統(tǒng)計股票平均報價的應用中的Web服務,然后利用JSP技術把最終結果顯示出來。以下顯示了JSP組件的角色。



圖 5

Thick Client Connectivity

有些Web服務的連接適合用胖客戶端。比方說,公司的內(nèi)部網(wǎng)。用戶界面的響應以及功能可能更加重要。

一個胖客戶端可以用很多種方法來聯(lián)接Web服務。比方說,可以用UDDI, WSDL, SOAP以及ebXML。這是一個性能比較低的例子,因為客戶端和服務端可能是由同樣的開發(fā)組開發(fā)的,所以不需要處理很多的XML傳送或者解析。

一個提高性能的方法是,胖客戶端通過其他更有效的端口來聯(lián)接,象Java RMI-IIOP。

V. Implementing Web Services

現(xiàn)在我們來看,如何在內(nèi)部實現(xiàn)Web服務。

數(shù)據(jù)傳送和轉換

在進入Web服務之前,我們必須解決如何把傳送進來的XML數(shù)據(jù)轉換成我們自己的服務能夠方便處理的格式,然后再把處理結果轉換成XML格式返回給客戶。因此一個開發(fā)人員需要一個強壯的機制來解析XML文件,綁定到Java對象,生成XML文件,并且傳送各種不同的XML格式文件。有時由于我們的應用程序支持不同的接口(例如:B2B伙伴的SOAP,基于瀏覽器的HTML格式,或者是無線的WML訪問同樣的Web服務)我們可能需要不同的服務接口來處理這些不同客戶端傳送過來的請求。

JAXP

用來處理XML的Java APIs是一套Java本地接口,它提供了可插入到XSLT引擎中的接口SAX,DOM。這些構成了解析和處理XML文檔的基礎。這些APIs對Web服務來說,是非常底層的,它給了我們用Java來訪問,修改以及創(chuàng)建XML文檔的全部功能。

For more information, please see:

http://java.sun.com/xml/tutorial_intro.html
http://java.sun.com/xml/xml_jaxp.html

JAXB

XML綁定技術可以把XML文檔和Java對象進行自由轉換。用JAXB,你可以在后臺的EJB層,把XML文檔轉換成Java對象。同樣你也可以把從EJB中取出的Java對象轉換成XML文檔返回給用戶。

JAXB接口提供了比SAX和DOM更高級的方法來處理XML文檔。它提供的特性可以在XML數(shù)據(jù)和Java類之間互相映射,提供了一個簡單的方法來轉換XML數(shù)據(jù)。它比逐個解析標記更簡單。

XSLT

從商業(yè)伙伴那里傳送過來的XML文檔可能和內(nèi)部使用的格式不相同,比方說商業(yè)伙伴那里用"OrderNum",而內(nèi)部使用"OrderID"。

我們經(jīng)常為了響應不同的客戶請求,而重新格式化XML數(shù)據(jù)文檔。舉例來說,一個商業(yè)伙伴的請求可能傳送一個SOAP表單,而一些瀏覽器用戶可能是一個XHTML。在一個更復雜的系統(tǒng)中,我們可能需要支持很多種不同的表現(xiàn)形式,象WML表單或者VoiceXML。這要求我們有一種機制來把各種XML以基本的XML響應格式來傳送給我們系統(tǒng)中不同的接口。

XML Stylesheet Language Transformations (XSLT)

是一種轉換XML格式的機制。一個stylesheet可以指定一系列的模版對應規(guī)則,并把它們賦給一個可遞歸的,象DOM這樣的模型。一個XSLT引擎可以用stylesheet來轉換XML文檔。XSLT stylesheet的語法是非常有表現(xiàn)力的,包含了循環(huán),條件和數(shù)學表達式等。還有類似于函數(shù)(function)的機構和概念上的遞歸。

Shared Context

當兩個商業(yè)發(fā)生交易的時候,通常有一個上下文的關系。這個關系是指定給合作伙辦的一個協(xié)議,或者是一種商業(yè)規(guī)則,這樣就可以給不同的合作伙伴進行交易。此外,一個商業(yè)協(xié)作在一段時間內(nèi)可能調(diào)用不同的接口。每一個這樣的調(diào)用都是處理同一個商業(yè)關系的,可能出現(xiàn)在整個商業(yè)生命周期中。

在J2EE Web服務中,為這個關系建一個離散的位置是一種建議的實現(xiàn)方法。作為一個開發(fā)人員,你應該在復雜的Web服務中需要這樣的關系,并且為你的系統(tǒng)結構設計一個離散的組件來控制它。目前這種關系是通過數(shù)據(jù)庫訪問(JDBC)來實現(xiàn)的。但是,Context API可以把Web服務中需要對這種關系的訪問操作作為一種流控制。這樣,這些共享的數(shù)據(jù)就可以由各種組件來訪問,象Servlet, JSP或者EJB組件。

Business Layer

當傳送進來的XML數(shù)據(jù)被轉換成Java對象后,這個數(shù)據(jù)已經(jīng)準備被傳送到EJB商務層做處理。EJB技術是一種用Java來創(chuàng)建商業(yè)組件的標準。用EJB組件,你可以從容器中得到一些服務,象安全性,狀態(tài)保持,連接池,負載平衡以及失敗恢復。

在EJB2.0標準中有3中EJB組件:

Session Beans

進行客戶端的工作。一般來說,Session Bean生命周期短,執(zhí)行快速的操作,象提交訂單,計算交易稅額。

Entity Beans

表現(xiàn)商業(yè)數(shù)據(jù)。一般來說,Entity Bean生命周期長,并且映射到后臺的存儲介質(zhì)內(nèi),象RDBMS或者OODBMS系統(tǒng)。Entity Bean分為兩種類型:bean-managed persistent 和container-managed persistent

MessageDriven Beans

是消息導向組件。它們通過消息導向中間件來接收消息象IBM MQSeries或者TIBCO Rendezvous。消息也可以通過Java客戶端利用Java Message Service (JMS) 標準來發(fā)送。當消息到達后,一般用JMS API來訪問。

一般來說,session beans 通過調(diào)用entity bean來完成希望的操作。比方說,一個用來計算訂單價格的session bean,可能調(diào)用到表示產(chǎn)品和訂單的entity bean。 Message-driven beans 用來接收消息,或者傳送消息到那些session beans 或者 entity beans.



圖6顯示了一個EJB組件交互的機制。

你可以用Java Naming和JNDI API來創(chuàng)建,查找以及刪除EJB組件。這個API是用來訪問J2EE發(fā)布系統(tǒng)中外部資源的標準API,可以訪問包括數(shù)據(jù)庫驅動,消息中間件,或者創(chuàng)建EJB的程序。

更多 EJB資料, 請查閱:

· http://java.sun.com/products/ejb/white/white_paper.html
· http://java.sun.com/products/ejb/
· http://www.theserverside.com
· "Mastering Enterprise JavaBeans" by Ed Roman, published by John Wiley & Sons.

VI. Performing Back-End Integration

最后來討論用J2EE來開發(fā)Web服務的時候,如何與后臺系統(tǒng)相連,象數(shù)據(jù)庫,原先的系統(tǒng)和其他的商業(yè)伙伴。

Database Connectivity

為了聯(lián)接關系數(shù)據(jù)庫,開發(fā)人員必須選擇APIs: The JDBC API 是一個用來訪問支持SQL的關系數(shù)據(jù)庫API.。(這個相信大家都知道了。)

SQL/J

是用Java編寫的標準的嵌入式SQL。類似于在HTML中嵌入JSP組件。

Legacy System Connectivity

在企業(yè)級開發(fā)中,與現(xiàn)存的系統(tǒng)相連接,一直都是一個比較困難的任務。大部分企業(yè)應用都是一個大雜燴,包含象SAP R/3, Siebel, i2以及一些客戶服務系統(tǒng)。整合工作是一個手工任務,因為對現(xiàn)存的系統(tǒng)可用方案并不多。軟件獨立開發(fā)商被要求編寫一個在任何平臺上都可以運行的客戶適配器,但這缺乏一個統(tǒng)一的標準平臺。

J2EE Connector Architecture (JCA)

是在工業(yè)中應用的,一個針對現(xiàn)存系統(tǒng)的適配器。你可以用它來連接現(xiàn)在的系統(tǒng),或者編寫你自己的適配器。它可以運行在與任何J2EE兼容的環(huán)境中。用JCA,你只要編寫一個適配器,就可以在任何J2EE環(huán)境中運行。對于軟件獨立開發(fā)商來說,這為他們提供了一個整合現(xiàn)存系統(tǒng)的方案。事實上,這些適配器正在開發(fā)中,對最終開發(fā)者來說,這的確是令人激動的。

Business Partner Connectivity

后臺系統(tǒng)的最后一個類型是商業(yè)伙伴的Web服務。商業(yè)伙伴用全球認定的XML標準來暴露出一些他們自己的系統(tǒng),在我們發(fā)布自己的Web服務時,可能會用到他們的這些服務。一般來說,UDDI用來注冊Web服務,WSDL用來描述Web服務,SOAP和ebXML用來處理商務交易。

你的EJB組件可以調(diào)用JAP套件來訪問商業(yè)伙伴的Web服務,這在之前已經(jīng)介紹過了。

用 Java API for XML Registries (JAXR) 在UDDI注冊中心查找商業(yè)伙伴的Web服務。

用 Java API for XML RPC (JAX/RPC) 處理到外部Web服務的請求。

用 Java API for XML Messaging (JAXM) 發(fā)送SOAP 或者 ebXML 消息到外部Web服務。

用 Java API for XML Parsing (JAXP) and the Java API for XML Binding (JAXB)

把Java數(shù)據(jù)轉換成適用于合作伙伴的XML格式。同樣可以用來把合作伙伴那邊的數(shù)據(jù)轉換成易于自己處理的XML格式,或者進行XSLT數(shù)據(jù)轉換。

結合使用Java標準APIs和J2EE Web服務構架,我們就可以建立強大的跨平臺的系統(tǒng)。利用它們,我們可以與商業(yè)伙伴共享數(shù)據(jù),提供完整的end-to-end的Web服務解決方案。見圖7。
?



飛翔 2006-08-17 22:16 發(fā)表評論
]]>
waphttp://www.aygfsteel.com/ytfei/archive/2006/08/13/63318.html飛翔飛翔Sun, 13 Aug 2006 06:51:00 GMThttp://www.aygfsteel.com/ytfei/archive/2006/08/13/63318.htmlhttp://www.aygfsteel.com/ytfei/comments/63318.htmlhttp://www.aygfsteel.com/ytfei/archive/2006/08/13/63318.html#Feedback0http://www.aygfsteel.com/ytfei/comments/commentRss/63318.htmlhttp://www.aygfsteel.com/ytfei/services/trackbacks/63318.htmlhttp://www.ust.hk/itsc/wap/emulators/nokia.html

http://www2.chn.monternet.com:8080/devdownload/DevWapSimulator.jsp

飛翔 2006-08-13 14:51 發(fā)表評論
]]>
常用開源協(xié)議http://www.aygfsteel.com/ytfei/archive/2006/07/13/57951.html飛翔飛翔Thu, 13 Jul 2006 04:49:00 GMThttp://www.aygfsteel.com/ytfei/archive/2006/07/13/57951.htmlhttp://www.aygfsteel.com/ytfei/comments/57951.htmlhttp://www.aygfsteel.com/ytfei/archive/2006/07/13/57951.html#Feedback0http://www.aygfsteel.com/ytfei/comments/commentRss/57951.htmlhttp://www.aygfsteel.com/ytfei/services/trackbacks/57951.html常用開源協(xié)議

?

開源在今天的軟件業(yè)已經(jīng)很普遍,但開源是否意味著使用者可以對開源后的代碼為所欲為呢?答案是否定的。開源運動同樣有自己的游戲規(guī)則和道德準則。不遵行這些規(guī)則不但損害開源運動的健康發(fā)展,也會對違規(guī)者造成名譽和市場上的損失,更可能陷入法律糾紛和賠償。

現(xiàn)今存在的開源協(xié)議很多,而經(jīng)過Open Source Initiative組織通過批準的開源協(xié)議目前有58種。我們在常見的開源協(xié)議如BSD, GPL, LGPL,MIT等都是OSI批準的協(xié)議。如果要開源自己的代碼,最好也是選擇這些被批準的開源協(xié)議。

這里我們來看四種最常用的開源協(xié)議及它們的適用范圍,供那些準備開源或者使用開源產(chǎn)品的開發(fā)人員/廠家參考。

現(xiàn)今存在的開源協(xié)議很多,而經(jīng)過Open Source Initiative組織通過批準的開源協(xié)議目前有58種。我們在常見的開源協(xié)議如BSD, GPL, LGPL,MIT等都是OSI批準的協(xié)議。如果要開源自己的代碼,最好也是選擇這些被批準的開源協(xié)議。


BSD開源協(xié)議

BSD開源協(xié)議是一個給于使用者很大自由的協(xié)議。基本上使用者可以”為所欲為”,可以自由的使用,修改源代碼,也可以將修改后的代碼作為開源或者專有軟件再發(fā)布。


但”為所欲為”的前提當你發(fā)布使用了BSD協(xié)議的代碼,或則以BSD協(xié)議代碼為基礎做二次開發(fā)自己的產(chǎn)品時,需要滿足三個條件:

1.? 如果再發(fā)布的產(chǎn)品中包含源代碼,則在源代碼中必須帶有原來代碼中的BSD協(xié)議。

2.? 如果再發(fā)布的只是二進制類庫/軟件,則需要在類庫/軟件的文檔和版權聲明中包含原來代碼中的BSD協(xié)議。

3.? 不可以用開源代碼的作者/機構名字和原來產(chǎn)品的名字做市場推廣。

BSD代碼鼓勵代碼共享,但需要尊重代碼作者的著作權。BSD由于允許使用者修改和重新發(fā)布代碼,也允許使用或在BSD代碼上開發(fā)商業(yè)軟件發(fā)布和銷售,因此是對商業(yè)集成很友好的協(xié)議。而很多的公司企業(yè)在選用開源產(chǎn)品的時候都首選BSD協(xié)議,因為可以完全控制這些第三方的代碼,在必要的時候可以修改或者二次開發(fā)。

Apache Licence 2.0

Apache Licence是著名的非盈利開源組織Apache采用的協(xié)議。該協(xié)議和BSD類似,同樣鼓勵代碼共享和尊重原作者的著作權,同樣允許代碼修改,再發(fā)布(作為開源或商業(yè)軟件)。需要滿足的條件也和BSD類似:

1.需要給代碼的用戶一份Apache Licence

2.如果你修改了代碼,需要再被修改的文件中說明。

3.在延伸的代碼中(修改和有源代碼衍生的代碼中)需要帶有原來代碼中的協(xié)議,商標,專利聲明和其他原來作者規(guī)定需要包含的說明。

4. 如果再發(fā)布的產(chǎn)品中包含一個Notice文件,則在Notice文件中需要帶有Apache Licence。你可以在Notice中增加自己的許可,但不可以表現(xiàn)為對Apache Licence構成更改。

Apache Licence也是對商業(yè)應用友好的許可。使用者也可以在需要的時候修改代碼來滿足需要并作為開源或商業(yè)產(chǎn)品發(fā)布/銷售。

GPL

我們很熟悉的Linux就是采用了GPL。GPL協(xié)議和BSD, Apache Licence等鼓勵代碼重用的許可很不一樣。GPL的出發(fā)點是代碼的開源/免費使用和引用/修改/衍生代碼的開源/免費使用,但不允許修改后和衍生的代碼做為閉源的商業(yè)軟件發(fā)布和銷售。這也就是為什么我們能用免費的各種linux,包括商業(yè)公司的linux和linux上各種各樣的由個人,組織,以及商業(yè)軟件公司開發(fā)的免費軟件了。

GPL協(xié)議的主要內(nèi)容是只要在一個軟件中使用(“使用”指類庫引用,修改后的代碼或者衍生代碼)GPL協(xié)議的產(chǎn)品,則該軟件產(chǎn)品必須也采用GPL協(xié)議,既必須也是開源和免費。這就是所謂的”傳染性”。GPL協(xié)議的產(chǎn)品作為一個單獨的產(chǎn)品使用沒有任何問題,還可以享受免費的優(yōu)勢。

由于GPL嚴格要求使用了GPL類庫的軟件產(chǎn)品必須使用GPL協(xié)議,對于使用GPL協(xié)議的開源代碼,商業(yè)軟件或者對代碼有保密要求的部門就不適合集成/采用作為類庫和二次開發(fā)的基礎。

其它細節(jié)如再發(fā)布的時候需要伴隨GPL協(xié)議等和BSD/Apache等類似。

LGPL

LGPL是GPL的一個為主要為類庫使用設計的開源協(xié)議。和GPL要求任何使用/修改/衍生之GPL類庫的的軟件必須采用GPL協(xié)議不同。LGPL 允許商業(yè)軟件通過類庫引用 (link)方式使用LGPL類庫而不需要開源商業(yè)軟件的代碼。這使得采用LGPL協(xié)議的開源代碼可以被商業(yè)軟件作為類庫引用并發(fā)布和銷售。

但是如果修改LGPL協(xié)議的代碼或者衍生,則所有修改的代碼,涉及修改部分的額外代碼和衍生的代碼都必須采用LGPL協(xié)議。因此LGPL協(xié)議的開源代碼很適合作為第三方類庫被商業(yè)軟件引用,但不適合希望以LGPL協(xié)議代碼為基礎,通過修改和衍生的方式做二次開發(fā)的商業(yè)軟件采用。

GPL/LGPL都保障原作者的知識產(chǎn)權,避免有人利用開源代碼復制并開發(fā)類似的產(chǎn)品。



飛翔 2006-07-13 12:49 發(fā)表評論
]]>
魔獸音效http://www.aygfsteel.com/ytfei/archive/2006/07/13/57894.html飛翔飛翔Thu, 13 Jul 2006 00:54:00 GMThttp://www.aygfsteel.com/ytfei/archive/2006/07/13/57894.htmlhttp://www.aygfsteel.com/ytfei/comments/57894.htmlhttp://www.aygfsteel.com/ytfei/archive/2006/07/13/57894.html#Feedback0http://www.aygfsteel.com/ytfei/comments/commentRss/57894.htmlhttp://www.aygfsteel.com/ytfei/services/trackbacks/57894.html
惡魔獵手- (英雄,城鎮(zhèn)中心)
=建造音效=
- At last, we shall have revenge! 終于,我們可以報仇了!
=選定音效=
- The time has come. 是時候了
- We must act! 我們必須行動了!
- My blade thirsts 我的刀刃渴望著……
- Quickly! 快!
- Command Me! 命令我吧!
=行動/執(zhí)行動作音效=
- [思想控制] You are spellbound!*** 你已經(jīng)著魔了
- [蛻變] Time to raise hell! 呼喚地獄的時刻到了
- [吸魂] Your soul is mine!*** 你的靈魂屬于我
- [鬼怪視界] Hide no longer!*** 你無處可藏
- Anatorettador!** 精靈語
- Though I be damned! 就算我是被詛咒的!
- Duranacal.** 精靈語
- At last. 終于
- Hmmm. 唔
=罵玩家音效=
- I shall fight fire with fire! 我要以火焰來克制火焰。
- Chaos boils in my veins! 混沌的力量在我血液中沸騰
- Demon blood is thicker than... regular blood. 惡魔之血濃于……一般的血
- I like my enemies dead and my blades flaming. 最愛看敵人死在我燃燒的刀刃下
- I love green trees! (注解: 這個很粗暴. 在游戲中其實是倒過來的, 我不想把它拼出來所以我把它倒過來了. )
- You will perish in flames (咳嗽聲) Ops, sorry! 你將在火焰中毀滅(咳嗽)哦,對不起!
- Darkness called, ... but I was on the phone, so I missed him. I tried to *69 Darkness, but his machine picked up. I yelled: "Pick up the phone Darkness", but he ignored me. Darkness must have been screening his calls. 黑暗之王一度召喚我,……但我在打電話,所以我錯過了。我試著回撥給他,但只聽到錄音留言。我喊道:“拿起電話呀詘抵酢保撬煥砦搖:詘抵躋歡ㄊ瞧簾瘟慫牡緇啊?br />=攻擊音效=
- [.vs 英雄] For Calendor! 為了Kalimdor
- None shall survive! 擋我者死!
- Your blood is mine! 喝你的血!
- Run for your life! 快逃命吧!
- Revenge! 復仇!

叢林守護者- (英雄,城鎮(zhèn)中心)
=建造音效=
- I must safegaurd the land! 保護大地是我的職責。
=選定音效=
- Is there danger? 有險情嗎?
- Command me. 命令我吧
- Who threatens the wilds? 誰在威脅著大自然?
- The time is now. 就是現(xiàn)在
- Nature is restless. 大自然永不寧靜
=行動/執(zhí)行動作音效=
- [自然之觸] Everything I touch dies or comes back to life! 我的觸碰帶來死亡和再生!
- [扼死藤] This should weed out a few! 這些雜草應該清除
- [荊棘] You mess with the branch, you get the thorns! 你跟樹枝戰(zhàn)斗,就得面對荊棘。
- [寧靜] The calm, before the storm. 暴風雨前的寧靜
- By the spirits! 以精靈們的力量!
- For Calendor! 為了Kalimdor!
- Well, there it is. 好,在那邊
- So shall is be. 理應如此
- Naturally. 自然而然
=罵玩家音效=
- My father was mounted over someone''s fireplace. 我父親是畫在壁爐上方的座騎
- Feel natural, nature''s way. 感受大自然的自然
- Don''t let the doe hit you on the way out! 那些母鹿要來扁你了
- When I Attack, part 3. 當我攻擊時,第3部分
- Free rides for the ladies MM免費騎哦
- Heard up! 收到!
=攻擊音效=
- [.vs 英雄] Smite the defilers of the land! 給污染者以致命一擊!
- Feel nature''s wrath! 感受自然的憤怒!
- Death to all defilers! 污染者,受死!
- None shall harm the wilds! 沒有人可以傷害大自然!

月亮女祭祀- (英雄,城鎮(zhèn)中心)
=建造音效=
- Warriors of the night, assemble! 夜之戰(zhàn)士們,集結起來!
=選定音效=
- We are poised to strike! 我們隨時準備戰(zhàn)斗!
- We must act! 我們得行動了!
- I am vigilant! 我時刻警惕著!
- Trust in my command. 相信我的指揮吧!
=行動/執(zhí)行動作音效=
- [月光] Godess, grant me sight! 女神啊,賜予我慧眼吧!
- [月反射] Let me bounce this off you. 從你身上反彈吧!
- [灼光] Highbeams on! 強光照射!
- [強擊] Shoot to kill! 射殺!
- [黎明] Darkness falls across the land. 黑暗降臨大地(知道MJ的Thriller嗎?Darkness Falls Across The Land ,The Midnight Hour Is Close At Hand,Creatures Crawl In Search Of Blood……''Cause This Is Thriller, Thriller Night……MJ開始與一群僵尸跳舞^o^ )
- Leading the way! 領路!
- Onward! 前進!
- As I thought. 正合我意
- The Godess agrees. 正如女神所愿
=罵玩家音效=
- I command the army of Darkness! 我指揮著黑暗(暗夜)部隊!
- I''m caught between the moon and NightElf city. 我往返于月亮與夜精靈城之間
- Come on! We''re burning moonlight. 來吧!我們是燃燒的月之光
- When a Treant falls in the forest, does it make a sound? 一個樹人在森林里倒下時,會發(fā)出聲音嗎?
=攻擊音效=
- [.vs 英雄] By the Godess! 以女神的力量!
- Strike! 進攻!
- For the Godess! 為了女神!
- Prepare to be Moonstruck!準備接受月神之擊!(Moonstruck的字典解釋:源于月光能引起精神錯亂的信仰,是不是有點諷刺?)

Warden
守望者
Ready - "My prey is near." ---我的獵物就在附近。
Warcry - "Justice has come." ---審判降臨。
What1 - "Have you reached a verdict?"---你有判決了嗎?
What2 - "Let me investigate." ---讓我來仔細調(diào)查
What3 - (Elvish)
What4 - (Elvish)
What5 - "I am the iron hand of justice."---我是司法(正義)的鐵碗。
Yes1 - "Let the hunt begin."---狩獵開始吧。
Yes2 - "Understood." ---明白。
Yes4 - "I can taste their fear."---我能感覺到他們的恐懼。
Yes5 - "Justice shall be swift." ---執(zhí)法必須迅速。
YesAttack1 - "They shall not escape!" ---他們決對逃脫不了!
YesAttack2 - "Let justice be served!" ---為司法服務!
YesAttack3 - "I am the law." ---我就是法律。
Pissed1 - "I shall be your executioner." ---我會是你的死刑執(zhí)行者。
Pissed2 - "Only the guilty need fear me." ---只有犯罪者對我感到恐懼。
Pissed3 - "Justice may be blind, but i'm not." ---司法可能有盲目,但,我沒有。
Pissed4 - "Truth, Justice and the Night Elf way." ---執(zhí)行真理,正義和夜精靈的路線(方法?)
Pissed5 - "You think you're above the law?" ---你認為你能凌駕于法律之上?
Pissed6 - "What we have here is a failure to communicate." ---我們在這所面對的是溝通的失敗(既然已經(jīng)這樣,沒有溝通的必要了。)
Pissed7 - "I hold you in contempt."---對你,我只有蔑視。(鄙視你!!!:)
Pissed8 - "He's no good to me if he's dead." ---他死了的話,對我毫無價值。(追殺狂。。。)
ORC的:
劍圣- (英雄,城鎮(zhèn)中心)
=建造音效=
- I obey the six vengance! (原帖都沒翻譯...obey是執(zhí)行的意思,vengance,復仇,報仇,連起來我也不知道.我執(zhí)行這6個復仇?不通順...)
=選定音效=
- I am yours! 我屬于你!
- Ohh! 噢!
- Yesa, Lord!* 是,主人!
- What task is there?有什么任務?
=行動/執(zhí)行動作音效=
- I hearo and obey!* 我聽從命令!(劍圣說的是日式英語……把r音發(fā)成魯?shù)龋?
- Hai! 日語,嗨咿!
- Excellent choice! 完美的選擇!
- Yes, huh! 是,哈!
=罵玩家音效=
- Snatch the pebble from my hand, grasshopper!
- My a blade can cut through armor, and still cut a tomato!* 我的刀可以切穿盔甲,切到里面的番茄(心臟)
- Twin blade action, for clean, close shave everytime! 看我的雙刀流……每次都可以把臉刮的很干凈~(剔須刀呀?)
- Wasabi! 日語,芥末 (……劍圣整個一 *** 武士)
=Attack Sounds=
- [.vs 英雄] For the burning Blade! 為了燃燒之刃
- Taste a* my blade! 嘗嘗我的利刃
- Ailease! *喊聲*
- Hooah! *吼聲*

先知- (英雄,城鎮(zhèn)中心)
=建造音效=
- The future is ours! 未來屬于我們!
=選定音效=
- My eyes are open. 我洞悉一切
- Seeing is believing! 眼見為實
- Do you need my counsel? 需要我的忠告嗎?
- Destiny awaits. 命運在等待
=行動/執(zhí)行動作音效=
- It is certain. 確信無疑
- Of course. 當然
- I see. 明白
- Watch out!
=罵玩家音效=
- I see dead people. 我看見死人了(開地圖秘籍哦,果然是farseer)
- Touch you tongue to mine! 敢用你的舌頭舔我! (狼的呻吟聲)
- Concentrate and ask again. 思想集中一點!再問我一遍
- Outlook not so good. 前景不太理想(暗指微軟的outlook不太好用)
- Reply hazy. Try again! 回答的摸棱兩可,再說一遍!
=攻擊音效=
- [.vs 英雄] Spirits of Earth and Storm, strike! 大地與風暴的靈魂啊,攻擊吧!
- Strike! 進攻!
- Look out! 注意!
- Attack! 進攻!

牛頭人酋長- (英雄,城鎮(zhèn)中心)
=建造音效=
- I have an axe to grind! 我有把斧子要磨
=選定音效=
- I stand ready! 我準備好了
- Your command? 你的命令?
- Your order? 你的指示?
- What would you ask of me? 你要我做什么?
=行動/執(zhí)行動作音效=
- Done! 完成!
- For my ancestors!為了我的祖先們!
- An excellent plan! 好計劃!
- Yes Chieftan? 是,酋長?(他自己也是酋長哦)
=罵玩家音效=
- Mmmm. My back is killing me! 唔,我的后背要了我的命。
- I need to take a load off! 我需要減輕負荷。
- Rrrrggg! I think I have a splinter! 呃啊~~~~我想我的骨頭碎了!
- These poles are heavy, I should find someone else to tote em!這些柱子好沉啊,我該找別的人來背它(找個真人來作我的圖騰)
- I used to have to go to war uphills, both ways!我以前打仗的時候還得上坡,兩個方面……
- Your way, right away! 一是你上,二是馬上
=攻擊音效=
- [.vs 英雄] For the War Chief and the Tribes! 為了酋長和部落!
- For the Tribes! 為了部落!
- Honorguide me!* 榮譽引導著我!
- None shall pass! 把命留下!

Shadow Hunter
暗影獵手
Ready - "Want to see somethin' real scary?" ---想來點真正讓人驚慌的玩意兒?
Warcry - "It be the mad time man." ---這真是一個瘋狂的時代。
What1 - "Who do I kill first?" ---先來干掉哪個?
What2 - "Where our enemies be hidin'?" ---我們的敵人藏身在哪里?
What3 - "Use my power." ---以我的力量。
What4 - "Direct my blade." ---指引我的利刃。
What5 - "Who be my next victim?" ---接下來誰受死?
Yes1 - "Move faster." ---行動更快些。
Yes2 - "It be a pleasure." ---很樂意。
Yes3 - "Right." ---的確。
Yes5 - "We be jammin'." ---我們陷入了困境。
Yes6 - *laughs*
Yes7 - "Ya man."---年輕人。
YesAttack1 - "My blade be thirsty." ---我的刀刃渴望殺戮。
YesAttack2 - "I pity the fool." ---我真為那些愚蠢的家伙感到可憐。
YesAttack3 - "Killin' be easy." ---將他殺死,簡單。
YesAttack4 - "Die!" ---死吧。
Pissed1 - "Keepin it real, up in the feal." ---保持真實,??
Pissed2 - "Your commander is a fool." ---你的指揮官是個傻瓜。
Pissed3 - "Call me for your free reading." ---有免費閱讀的話請叫上我。
Pissed4 - "You're the baddest soul in town man." ---你是整個部落最糟糕的靈魂,小子。
Pissed5 - "Humans. They think they know everything." ---人類,他們總以為自己無所不知。
Pissed6 - "You lack discipline." ---你缺乏紀律。
Pissed7 - "Stop whinin'." ---別再抱怨了,年輕人。
Pissed8 - "Look at me. I'm happy." ---看看我。我多開心。
Pissed9 - "Ooh, Baby."---喔,孩子。
UD的:

死亡騎士- (英雄,城鎮(zhèn)中心)
=建造音效=
- The pact is sealed! 契約已訂!
=選定音效=
- You called? 你召喚我嗎?
- My patience has ended! 我的耐心已盡!
- I am the Darkness! 我就是黑暗!
- My vengence is yours! 你就是我的復仇!
=行動/執(zhí)行動作音效=
- Let battle be joined! 加入戰(zhàn)斗!
- As you order! 聽從命令!
- Hiyah! 嗨呀!
- At last! 終于!
- For the Lich King!為了巫妖王!
=罵玩家音效=
- Has hell frozen over yet? 地獄還沒有凍住嗎?
- I am the one horseman of the Apocalypse. 我是天命騎士之一。
- I hate people, but I love gatherings! 我恨人們,但我喜歡收藏品
- I''m a Death Night Rider! Muh ha ha ha 我是一個死亡騎士(死掉的夜騎士)!啊哈哈哈
- Blueca!**
- Don''t touch me... I''m evil! 別碰我……我是邪惡的!
=攻擊音效=
- [.vs 英雄] Let terror reign! 讓恐懼統(tǒng)治一切吧!
- Feel my rath! 感受我的憤怒!
- Ride or die! 逃跑還是受死!
- By Nazul! 以Ner ''zhul的名義

恐懼之王- (英雄,城鎮(zhèn)中心)
=建造音效=
- The night beckons! 夜在召喚!
=選定音效=
- Greetings! 向您問候!
- What, mortal? 什么事,凡人
- What is it now? 現(xiàn)在呢?
- I must hunt soon! 我立即行動!
=行動/執(zhí)行動作音效=
- That was my plan! 正是我的計劃!
- Agreed! 同意!
- Very well. 很好!
- You thought of that? 你也那么想?
=罵玩家音效=
- If I have wings, why am I always walking? 既然我有翅膀,為什么我總是步行?
- (電話鈴聲) Yes? Arrgghh! For the last time, I''m a Dread Lord, not a Drug Lord! 喂?啊!!我說最后一次,我是一個恐怖魔王,不是毒品王!
- This is not a dress, it''s the standard Dread Lord uniform!這不是一般的服裝,這是恐怖魔王標準套裝!
- Dress to kill! Blah! 是穿來殺人的!廢話!
- (電話鈴聲) Yes? Darkness, hey, what''s up? The Demon Hunter left you a message? No, I don''t have his number. 喂?黑暗之王嗎?嗨,情況如何?惡魔獵手給你留了條短信?哦,不,我沒有他的號碼。
- And then, after I overthrow this fool... Oh! Hello! I didn''t know you were there. 然后,我揭穿這個笨蛋……啊,喂,我不知道你在那
- Imbisile! 不可思議
=攻擊音效=
- [.vs 英雄] Your soul is mine! 你的靈魂屬于我!
- I hunger! 我饑渴!
- Deathrageous! 死之怒!
- Die! 死吧!

巫妖- (英雄,城鎮(zhèn)中心)
=建造音效=
- The ancient evil survives! 遠古邪惡生還了!
=選定音效=
- I am sworn to Nazul! 我效忠于Ner ''zhul !
- Thy bidding? 你的命令?
- Direct me! 指示我吧!
- Yours to command! 由你指揮!
=行動/執(zhí)行動作音效=
- [清醒] Cllleeaarrr! 了 解!!!
- [冰霜鎧甲] Nazul protect them!Ner ''zhul保護他們!
- [冰河] Freeze! 結凍吧
- [召喚冰龍] Rise from your grave! 從墳墓中復活吧!
- So be it! 正是如此!
- By your words! 聽你的!
- It it destined! 這是宿命!
- Dead man walking! 死者在行走啊!
- Chilling! 顫抖吧!
=罵玩家音效=
- Could you chew that up for me? 能幫我咀嚼一下嗎?
- I''m so poor, I don''t even have calcium deposits! 我真可憐,我甚至連個鈣質(zhì)的驅殼都沒有。
- I am the Ghost of Warcraft past.我是魔獸之幽靈。
- I hear that banshee''s a real screamer! 我聽見女妖還真是能喊哪!
- You should see the skeletons in my closet! 你該看看我櫥子里的骷髏!
- Im hoe chap!**
- All the ladies dig rigor mortis. 女人們在掘墳。
- You are the Weakest Link, goodbye! 你是最爛的鏈接,再見
=攻擊音效=
- [.vs 英雄] For the burning Legion! 為了燃燒軍團!
- Embrace the end! 接受這個結局吧!
- I will crush you! 我要滅了你!
- Embrace the cold!接受寒冷吧!

Crypt Lord
地穴領主
Ready - "From the depths I come." ---我從深淵而來!(我從深奧中來!)
Warcry - "For the frozen throne." ---為了寒冰王座!
What1 - "Speak." ---講。
What2 - "I have heard the summons."---我已聽到了召喚。
What3 - "Time is fleeting." ---時間飛逝。(它是古老的蜘蛛帝國的皇帝)
What4 - "My might cannot be matched." ---我的威力無可匹敵!
What5 - "I serve only the frozen throne." ---我只為寒冰王座服務!(我只出現(xiàn)在資料片中。)
Yes1 - "Ill see to it." ---我會注意的。
Yes2 - "By Nerub." ---為了Nerub(蜘蛛帝國)。
Yes3 - "Indubitably." ---毫無疑問。
Yes4 - "Cheeky." ---厚顏無恥。
Yes5 - "Ill consume the living and the dead." ---疾病毀滅生存者和死亡者。
YesAttack1 - "Oblivion awaits." ---赦免在等待。
YesAttack2 - "Feel the venom of Nerub." ---感受Nerub的怨恨!
YesAttack3 - "Raid!" ---襲擊!
Pissed1 - "The scourge will devour all." ---天災將吞噬一切!
Pissed2 - "The strands of destiny weave only a web of death." ---命運之網(wǎng),死亡之網(wǎng)。
Pissed3 - "It was good to be the king." ---身為國王,感覺不錯。
Pissed4 - "Humans check in. They don't check out." ---人類登記進來,卻不能登記離開。
Pissed5 - "I'm the fifth beatle."---我是第五只甲殼蟲。(我是第五位披頭士。*beatles,披頭士,甲客蟲,著名的四人 樂隊*)
Pissed6 - "And they say Blizzard games don't have bugs."---他們說blizzard的游戲沒有蟲子。(他們說bizzard的游戲 沒有bugs。)
HUM的:
大法師- (英雄,城鎮(zhèn)中心)
=建造音效=
- This had better be worth it! 這樣做最好值得!
=選定音效=
- You require my assistance? 需要我的協(xié)助嗎?
- What is it now? 現(xiàn)在如何?
- Get on with it! 繼續(xù)!
- Well? 什么?
=行動/執(zhí)行動作音效=
- I can hardly wait! 我不能再等了!
- Perfect! 好極了!
- Whatever! 怎樣都行!
- Fine! 很好!
=罵玩家音效=
- Don''t you have a strategy? 你就不能有點戰(zhàn)略嗎?
- Your prattle begins to annoy me. 我開始對你的天真感到厭煩了
- You''d best stay clear of me, or I''ll turn you into a mindless sheep! 你最好別碰我,不然我會把你變成一只沒大腦的綿羊!
- I don''t waste my magic on just anything! 我不會隨便浪費我的魔法的
=攻擊音效=
- [.vs 英雄] For glory! 為了榮譽!
- To battle! 戰(zhàn)斗啊!
- For glory! 為了榮譽!
- Nimflorie frostades seda!** (吟唱咒語)

山丘之王- (英雄,城鎮(zhèn)中心)
=建造音效=
- Alright, who wants some? 好吧,誰想來試試
=選定音效=
- Aye? 什么?
- Wait ''til you see me in action!* 等待行動指示
- Give me something to do! 讓我做點事吧
- Hmmmph! 恩!
=行動/執(zhí)行動作音效=
- Brilliant! 英明!
- I''m coming through! 我來了!
- Move it! 行動!
- Out of my way! 讓開!
=罵玩家音效=
- Could you put some bonus points in my drinking skills? 你能給我的喝酒技能升幾級嗎?
- Any fish and chips shops about here?* 這附近有炸魚土豆片賣嗎?
- I think it''s time for a nippy sweetie!** 我認為該吃點心了。
- What the bloody hell are you playin'' at?* 該死的,你在玩些什么啊?
- There''s nothing more motivatin'' than fightin'' with a bad hangover!* 喝的爛醉然后打仗最爽了!
- Where''s the pub? 酒館在哪?
- Let''s get PIST! 去喝個痛快吧!
=攻擊音效=
- [.vs 英雄] For Kazmodon!** 為了Kazmodon!
- To arms! 拿起武器!
- Death comes for ye!* 死神來找你了!
- I''ll run em through!* 我來搞定他們!
- Watch this! 看這招!

圣騎士- (英雄,城鎮(zhèn)中心)
=建造音效=
- I live to serve all believers! 我為服務信徒而生!
=選定音效=
- What would you ask of me? 您要我做什么?
- I am not afraid! 我沒有恐懼!
- Let me face the peril! 讓我來面對危險!
- At your call! 為您效勞!
=行動/執(zhí)行動作音效=
- [驅魔] Strike down upon thee with great vengance and fury! 以復仇的憤怒力量擊倒汝!
- As you wish! 隨你所愿!
- For honor! 為了榮譽!
- For my people! 為了我的人民!
- It shall be done! 理應如此!
=罵玩家音效=
- It''s hammer time! 該掄起錘子了!
- I want to be your sledge hammer! 我愿成為您的巨錘!
- Touch me not, I am chaste! 別碰我,我是純潔的
- No, is that your final answer? 不,那就是你最后的回答?
- I have bad brethren 我已經(jīng)有很多兄弟了。
- Is that a sword? Luxury! Is that a horse? Sloth! Is that a helmet? Vanity! 那是劍嗎?奢侈!那是馬嗎?懶惰!那是頭盔嗎?虛榮!
=攻擊音效=
- [.vs 英雄] In Lightbringer''s name, have at thee! 以光明使者的名義,進攻汝!
- Justice will be served! 公正終將得以伸張
- Defending your name! 捍衛(wèi)您的名譽!
- Death to the infidels!異端者死!

BloodMage
血法師
Ready - "Burning to avenge" ---復仇在燃燒
Warcry - "By the blood of the high-born!" ---為了高等精靈之血!
What1 - "Do you see something?" --你看到什么了嗎?
What2 - (Elvish) ---(精靈語)
What3 - "Evil is near." ---邪惡就在附近
What4 - "I am here, mortal." ---我在這,人類。
What5 - "This battle bores me." ---戰(zhàn)爭讓我厭倦
Yes1 - (Elvish)
Yes2 - "For my people."---為了我的人民
Yes3 - (Elvish)
Yes4 - "For now."---就是現(xiàn)在。
Yes5 - "Bah, childs play."---呸,小孩子的玩意兒。
YesAttack1 - "I'll incinerate them." ---我來把他們燒成灰燼。
YesAttack2 - "For Quel'Thalas!" ---為了Quel'Thalas!(高等精靈國家)
YesAttack3 - "They shall burn" ---他們該被燒盡。
Pissed1 - "The blood of the high-born is my birth right." ---高等精靈之血是我出生的權利。
Pissed2 - "The ghosts of Quel'Thalas cry out for vengeance" ---Quel'Thalas的靈魂在呼喊著復仇。
Pissed3 - "I find your insolence disturbing" ---你的傲慢讓人惡心。
Pissed4 - "If you dont master your anger, your anger will master you. I should know" ---如果你不能控制你的憤怒, 你就會被你的憤怒控制。我應該知道的。(卻沒有做到。。)(玩游戲也是一樣,If you don't master your game,your game will master you,we should know.:)
Pissed5 - "Hi. My... name is Roy. I'm a magic addict." *murmuring*"Hi Roy" ---“hi,我的名字。。。是Roy,我為魔法癡迷”。*自言自語聲*hi,Roy。(學魔法的家伙,多少有點神經(jīng)。。)
Pissed6 - "My blood cries out for the vengeance of my people's blood. Which can only be repaid with at least twice as much blood. Or maybe three times as much blood. Like if you went to hell, and it was full of blood. And that blood was on fire. And it was raining blood. And maybe that would be enough blood. Ehh, but probably not."
---我的血液在為我族人的血液呼喊著復仇。至少必須用兩倍的血液來償還。或者是三倍的血液。而如果你去了地獄,那兒整個世界都是血,并且是燃燒著的血,并且天空也在下血。而這可能就是足夠多的血了。呃,也許不是。。(果然是bloodmage,一句話到處都是blood。
并且值得注意的是,這里有個很有趣的地方:在twice之前有2個blood,在three之前有3個blood,將full和fire看成four和five*諧音*,那么full之前也是4個blood。而fire所指的‘that blood’,就是full后面的那個,正是第五個blood。當然這只是我個人的看法,不知道是不是正確的:)

飛翔 2006-07-13 08:54 發(fā)表評論
]]>
主站蜘蛛池模板: 克拉玛依市| 营山县| 沂南县| 金昌市| 平昌县| 乌鲁木齐县| 措勤县| 大安市| 仪征市| 新干县| 大悟县| 阳信县| 井冈山市| 安福县| 巴中市| 珠海市| 克什克腾旗| 闻喜县| 泗水县| 海宁市| 翼城县| 宁蒗| 盈江县| 桑植县| 乾安县| 琼中| 新和县| 浠水县| 久治县| 扶余县| 仲巴县| 怀来县| 连州市| 鄂温| 浮梁县| 乃东县| 沈阳市| 光泽县| 柘城县| 越西县| 曲水县|