<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    2009年3月16日

    “又是一年畢業時 ”,看到一批批學子離開人生的象牙塔,走上各自的工作崗位;想想自己也曾經意氣風發、躊躇滿志,不覺感嘆萬千……本文是自己工作6年的經歷沉淀或者經驗提煉,希望對所有的軟件工程師們有所幫助,早日實現自己的人生目標。本文主要是關于軟件開發人員如何提高自己的軟件專業技術方面的具體建議,前面幾點旨在確定大的方向,算是廢話吧。
    '\ i'E*o5?5g6]#g(y)n8L1、分享第一條經驗:“學歷代表過去、能力代表現在、學習力代表未來。”其實這是一個來自國外教育領域的一個研究結果。相信工作過幾年、十幾年的朋友對這個道理有些體會吧。但我相信這一點也很重要:“重要的道理明白太晚將抱憾終生!”所以放在每一條,讓剛剛畢業的朋友們早點看到哈! TechWeb-技術社區7N9{'t%a+M
    2、一定要確定自己的發展方向,并為此目的制定可行的計劃。不要說什么,“我剛畢業,還不知道將來可能做什么?”,“跟著感覺走,先做做看”。因為,這樣的觀點會通過你的潛意識去暗示你的行為無所事事、碌碌無為。一直做技術,將來成為專家級人物?向管理方向走,成為職業經理人?先熟悉行業和領域,將來自立門戶?還是先在行業里面混混,過幾年轉行做點別的?這很重要,它將決定你近幾年、十年內“做什么事情才是在做正確的事情!”。 8R(X1}1g R/D$Z*K$y5U
    3、軟件開發團隊中,技術不是萬能的,但沒有技術是萬萬不能的!在技術型團隊中,技術與人品同等重要,當然長相也比較重要哈,尤其在MM比較多的團隊中。在軟件項目團隊中,技術水平是受人重視和尊重的重要砝碼。無論你是做管理、系統分析、設計、編碼,還是產品管理、測試、文檔、實施、維護,多少你都要有技術基礎。算我孤陋寡聞,我還真沒有親眼看到過一個外行帶領一個軟件開發團隊成功地完成過軟件開發項目,哪怕就一個,也沒有看到。倒是曾經看到過一個“高學歷的牛人”(非技術型)帶一堆人做完過一個項目,項目交付的第二天,項目組成員扔下一句“再也受不了啦!”四分五裂、各奔東西。那個項目的“成功度”大家可想而知了。 tech.techweb.com.cn&F,q9R;K/u.@
    4、詳細制定自己軟件開發專業知識學習計劃,并注意及時修正和調整(軟件開發技術變化實在太快)。請牢記:“如果一個軟件開發人員在1、2年內都沒有更新過自己的知識,那么,其實他已經不再屬于這個行業了。”不要告訴自己沒有時間。來自時間管理領域的著名的“三八原則”告誡我們:另外的那8小時如何使用將決定你的人生成敗!本人自畢業以來,平均每天實際學習時間超過2小時。 +j&G1B p7U/? g
    5、書籍是人類進步的階梯,對軟件開發人員尤其如此。書籍是學習知識的最有效途徑,不要過多地指望在工作中能遇到“世外高人”,并不厭其煩地教你。對于花錢買書,我個人經驗是:千萬別買國內那幫人出的書!我買的那些家伙出的書,100%全部后悔了,無一本例外。更氣憤的是,這些書在二手市場的地攤上都很難賣掉。“擁有書籍并不表示擁有知識;擁有知識并不表示擁有技能;擁有技能并不表示擁有文化;擁有文化并不表示擁有智慧。”只有將書本變成的自己智慧,才算是真正擁有了它。
    ,U5p1B&q9s4u程序開發,操作系統,服務器,源碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,源碼,黑客,安全,技術社區,技術論壇6、不要僅局限于對某項技術的表面使用上,哪怕你只是偶爾用一、二次。“對任何事物不究就里”是任何行業的工程師所不應該具備的素質。開發Windows應用程序,看看Windows程序的設計、加載、執行原理,分析一下PE文件格式,試試用SDK開發從頭開發一個Windows應用程序;用VC++、 Delphi、Java、.Net開發應用程序,花時間去研究一下MFC、VCL、J2EE、.Net它們框架設計或者源碼;除了會用J2EE、 JBoss、Spring、Hibernate, http://www.bt285.cn 等等優秀的開源產品或者框架,抽空看看大師們是如何抽象、分析、設計和實現那些類似問題的通用解決方案的。試著這樣做做,你以后的工作將會少遇到一些讓你不明就里、一頭霧水的問題,因為,很多東西你“知其然且知其所以然”!
    $Z.F7B.I2u1X7、在一種語言上編程,但別為其束縛了思想。“代碼大全”中說:“深入一門語言編程,不要浮于表面”。深入一門語言開發還遠遠不足,任何編程語言的存在都有其自身的理由,所以也沒有哪門語言是“包治百病”的“靈丹妙藥”。編程語言對開發人員解決具體問題的思路和方式的影響與束縛的例子俯拾皆是。我的經驗是:用面對對象工具開發某些關鍵模塊時,為什么不可以借鑒C、C51、匯編的模塊化封裝方式?用傳統的桌面開發工具(目前主要有VC++、Delphi)進行系統體統結構設計時,為什么不可以參考來自Java社區的IoC、AOP設計思想,甚至借鑒像Spring、Hibernate、JBoss等等優秀的開源框架?在進行類似于實時通信、數據采集等功能的設計、實現時,為什么不可以引用來自實時系統、嵌入式系統的優秀的體系框架與模式?為什么一切都必須以個人、團隊在當然開發語言上的傳統或者經驗來解決問題???“他山之石、可以攻玉”。 程序開發,操作系統,服務器,源碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,源碼,黑客,安全,技術社區,技術論壇:q8~7X.v'p&B/S
    8、養成總結與反思的習慣,并有意識地提煉日常工作成果,形成自己的個人源碼庫、解決某類問題的通用系統體系結構、甚至進化為框架。眾所周知,對軟件開發人員而言,有、無經驗的一個顯著區別是:無經驗者完成任何任務時都從頭開始,而有經驗者往往通過重組自己的可復用模塊、類庫來解決問題(其實這個結論不應該被局限在軟件開發領域、可以延伸到很多方面)。這并不是說,所有可復用的東西都必須自己實現,別人成熟的通過測試的成果也可以收集、整理、集成到自己的知識庫中。但是,最好還是自己實現,這樣沒有知識產權、版權等問題,關鍵是自己實現后能真正掌握這個知識點,擁有這個技能。
    9M2s*m+V.W"?*[*W3v)l+O9、理論與實踐并重,內外雙修。工程師的內涵是:以工程師的眼光觀察、分析事物和世界。一個合格的軟件工程師,是真正理解了軟件產品的本質及軟件產品研發的思想精髓的人(個人觀點、歡迎探討)。掌握軟件開發語言、應用語言工具解決工作中的具體問題、完成目標任務是軟件工程師的主要工作,但從軟件工程師這個角度來看,這只是外在的東西,并非重要的、本質的工作。學習、掌握軟件產品開發理論知識、軟件開發方法論,并在實踐中理解、應用軟件產品的分析、設計、實現思想來解決具體的軟件產品研發問題,才是真正的軟件工程師的工作。站在成熟理論與可靠方法論的高度思考、分析、解決問題,并在具體實踐中驗證和修正這些思想與方式,最終形成自己的理論體系和實用方法論。
    6l)d+H,S7~(B+`10、心態有多開放,視野就有多開闊。不要抱著自己的技術和成果,等到它們都已經過時變成垃圾了,才拿出來丟人現眼。請及時發布自己的研究成果:開發的產品、有創意的設計或代碼,公布出來讓大家交流或者使用,你的成果才有進化和升華的機會。想想自己2000年間開發的那些Windows系統工具,5、6年之后的今天,還是那個樣子,今天流行的好多Windows系統工具都比自己的晚,但進化得很好,且有那么多用戶在使用。并且,不要保守自己的技術和思想,盡可能地與人交流與分享,或者傳授給開發團隊的成員。“與人交換蘋果之后,每個人還是只有一個蘋果;但交換思想之后,每個人都擁有兩種思想”,道理大家都懂,但有多少人真正能做到呢? :n4K*z,@0l#t$?&]"r
    11、盡量參加開源項目的開發、或者與朋友共同研制一些自己的產品,千萬不要因為沒有錢賺而不做。網絡早已不再只是“虛擬世界”,網上有很多的開源項目、合作開發項目、外包項目,這都是涉獵工作以外的知識的絕好機會,并且能夠結識更廣的人緣。不要因為工作是做ERP,就不去學習和了解嵌入式、實時、通信、網絡等方面的技術,反過來也是一樣。如果當別人拿著合同找你合作,你卻這也不會,那也不熟時,你將后悔莫及。
    &_8[,U&x'N4{12、書到用時方恨少,不要將自己的知識面僅僅局限于技術方面。諾貝爾經濟學獎得主西蒙教授的研究結果表明: “對于一個有一定基礎的人來說,他只要真正肯下功夫,在6個月內就可以掌握任何一門學問。”教育心理學界為感謝西蒙教授的研究成果,故命名為西蒙學習法。可見,掌握一門陌生的學問遠遠沒有想象的那么高難、深奧。多方吸取、廣泛涉獵。極力夯實自己的影響圈、盡量擴大自己的關注圈。財務、經濟、稅務、管理等等知識,有空花時間看看,韜光養晦、未雨綢繆。
    3z&W3]3c1s3h13、本文的總結與反思: 8w0b/e(y:E4y3n3Q3|"|+{-k
    A:不要去做技術上的高手,除非你的目標如此。雖然本文是關于提高軟件開發知識的建議,做技術的高手是我一向都不贊同的。你可以提高自己的專業知識,但能勝任工作即止。
    4w#v8I5?(f,q-A程序開發,操作系統,服務器,源碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,源碼,黑客,安全,技術社區,技術論壇B:提高軟件知識和技術只是問題的表面,本質是要提高自己認識問題、分析問題、解決問題的思想高度。軟件專業知識的很多方法和原理,可以很容易地延伸、應用到生活的其它方面。 TechWeb-技術社區:H:e7P"C/V,v-g
    C:在能勝任工作的基礎上,立即去涉獵其它領域的專業知識,豐富自己的知識體系、提高自己的綜合素質,尤其是那些目標不在技術方面的朋友。
    posted @ 2009-04-05 15:53 wang9354| 編輯 收藏

    我們通常在開發web應用過程中,展現層Action的單元測試經常被我們忽視了,主要原因是:

    1、Action層的業務邏輯比較簡單。大家潛意識認為這一部分的代碼不重要。

    2、Action層難以模擬http請求傳遞參數,需要依賴web容器,因此給單元測試編寫帶來一定的難度。

    我寫了一個簡單的Action單元測試用例,供大家參考。基于struts的mock和webwork的ActionProxyFactory都可以進行Action的單元測試。我個人比較傾向與ActionProxyFactory做單元測試。其實寫action單元測試非常簡單,大致分為三步就可以完成單元測試:

    一、設置ActionContext上下文參數

    將表單傳遞的請求參數添加到map中

    二、創建Action動態代理對象

    通過public abstract ActionProxy createActionProxy(String namespace, String actionName, Map extraContext) throws Exception 創建action代理對象。

    三、junit斷言執行結果

    assertEquals(testAction.login(),”success”)

    詳細用例參考:

    public class TestActionTest extends BaseCaseTest{

    private ActionProxy proxy = null;

    private IVoucherService voucherService;

    @Before

    public void setUp() throws Exception {

    IMocksControl control = EasyMock.createControl();

    voucherService = control.createMock(IVoucherService.class);

    Map<String, Object> params = new HashMap<String, Object>();

    params.put(”loginId”,”test”);

    params.put(”password”,”111111″);

    params.put(”website”,” http://www.bt285.cn  ″);

    params.put(”name”,”小說″);

    params.put(”voucherService”, voucherService);

    Map extraContext = new HashMap();

    extraContext.put(ActionContext.PARAMETERS,params);

    try {

    proxy = ActionProxyFactory.getFactory().createActionProxy(”/ http://www.5a520.cn user”, “testAction”, extraContext);

    proxy.setExecuteResult(false);

    assertEquals(proxy.execute(),”success”);

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    @Test

    public void testLogin() {

     

    TestAction testAction = (TestAction) proxy.getAction();

    assertEquals(testAction.login(),”success”);

    }

    }

    注:創建代理action一定要執行proxy.execute()方法,否則參數不能夠增加到actionContext上下文中。因為proxy.execute()中會執行 invocation.invoke()核心方法,遍歷執行action中所有的攔截器,包括其中的參數攔截器

    posted @ 2009-03-21 23:24 wang9354| 編輯 收藏
     

    某天在服務器上的網頁打不開了,頻繁報以下錯誤。

    2007-3-18 1:08:26 org.apache.tomcat.util.threads.ThreadPool logFull
    嚴重: All threads (150) are currently busy, waiting. Increase maxThreads (150) or check the servlet status

    在網上找了些回答,以下是我覺得正確的回答:
    1.我想你的部分資源沒有釋放,積壓卡死的
    2.連接池問題
    3.應該是服務器端響應request的線程的處理時間過長導致的

    分析:
    當時使用網站的人數只有2個人,不可能答到到了并發線程150的上線。所以應該不是數據庫的問題。
    通過對出錯的提示判斷,應該是連接池使用不合理造成的,或者根本沒設置連接池。和數據庫連接的部分是使用Spring的數據源JDBC連的,如下:
    <beans>
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <!-- driver for MySQL-->
            <property name="driverClassName"><value>org.gjt.mm.mysql.Driver</value></property>
            <property name="url"><value>jdbc:mysql:// www.bt285.cn :3306/test?useUnicode=true&amp;characterEncoding=UTF8</value></property>
            <property name="username"><value>test</value></property>
            <property name="password"><value>test</value></property>      
    </beans>

    問題應該出現在Spring的DriverManagerDataSource上,它負責管理這些連接的。
    下邊是對DriverManagerDataSource 的解釋
    DriverManagerDataSource in Spring Framework

       javax.sql Interface DataSource

    Implementation of SmartDataSource that configures a plain old JDBC Driver via
    bean properties, and returns a new Connection every time.

    Useful for test or standalone environments outside of a J2EE container, either
    as a DataSource bean in a respective ApplicationContext, or in conjunction with
    a simple JNDI environment. Pool-assuming Connection.close() calls will simply
    close the connection, so any DataSource-aware persistence code should work.

    In a J2EE container, it is recommended to use a JNDI DataSource provided by the
    container. Such a DataSource can be exported as a DataSource bean in an
    ApplicationContext via JndiObjectFactoryBean, for seamless switching to and from
    a local DataSource bean like this class.

    If you need a "real" connection pool outside of a J2EE container, consider
    Apache's Jakarta Commons DBCP. Its BasicDataSource is a full connection pool
    bean, supporting the same basic properties as this class plus specific settings.
    It can be used as a replacement for an instance of this class just by changing
    the class name of the bean definition to
    "org.apache.commons.dbcp.BasicDataSource".

    -----------------------------------------------
    Many Jakarta projects support interaction with a relational database. Creating a
    new connection for each user can be time consuming (often requiring multiple
    seconds of clock time), in order to perform a database transaction that might
    take milliseconds. Opening a connection per user can be unfeasible in a
    publicly-hosted Internet application where the number of simultaneous users can
    be very large. Accordingly, developers often wish to share a "pool" of open
    connections between all of the application's current users. The number of users
    actually performing a request at any given time is usually a very small
    percentage of the total number of active users, and during request processing is
    the only time that a database connection is required. The application itself
    logs into the DBMS, and handles any user account issues internally.

    There are several Database Connection Pools already available, both within
    Jakarta products and elsewhere. This Commons package provides an opportunity to
    coordinate the efforts required to create and maintain an efficient,
    feature-rich package under the ASF license.

    The commons-dbcp package relies on code in the commons-pool package to provide
    the underlying object pool mechanisms that it utilizes.

    Applications can use the commons-dbcp component directly or through the existing
    interface of their container / supporting framework. For example the Tomcat
    servlet container presents a DBCP DataSource as a JNDI Datasource. James (Java
    Apache Mail Enterprise Server) has integrated DBCP into the Avalon framework. A
    Avalon-style datasource is created by wrapping the DBCP implementation. The
    pooling logic of DBCP and the configuration found in Avalon's excalibur code is
    what was needed to create an integrated reliable DataSource.

    看完了解釋,事實上是因為DriverManagerDataSource建立連接是只要有連接就新建一個connection,根本沒有連接池的作用。改為以下開源的連接池會好點。
    <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName">
    <value>org.hsqldb.jdbcDriver</value>
    </property>
    <property name="url">
    <value>jdbc:hsqldb:hsql:// www.5a520.cn :9001</value>
    </property>
    <property name="username">
    <value>sa</value>
    </property>
    <property name="password">
    <value></value>
    </property>
    </bean>

    測試通過,問題消除,如果沒有搜索引擎找答案不會這么快解決問題。

    posted @ 2009-03-19 13:03 wang9354| 編輯 收藏

    Nexus介紹

    Nexus 是Maven倉庫管理器,如果你使用Maven,你可以從Maven中央倉庫 下載所需要的構件(artifact),但這通常不是一個好的做法,你應該在本地架設一個Maven倉庫服務器,在代理遠程倉庫的同時維護本地倉庫,以節省帶寬和時間,Nexus就可以滿足這樣的需要。此外,他還提供了強大的倉庫管理功能,構件搜索功能,它基于REST,友好的UI是一個extjs的REST客戶端,它占用較少的內存,基于簡單文件系統而非數據庫。這些優點使其日趨成為最流行的Maven倉庫管理器。

     

    下載和安裝

    你可以從http://nexus.sonatype.org/downloads/  或是http://www.5a520.cn 下載最新版本的Nexus,筆者使用的是1.3.0版本。

    Nexus提供了兩種安裝方式,一種是內嵌Jetty的bundle,只要你有JRE就能直接運行。第二種方式是WAR,你只須簡單的將其發布到web容器中即可使用。

     

    Bundle方式安裝

    解壓nexus-webapp-1.3.0-bundle.zip 至任意目錄,如D:\dev_tools ,然后打開CMD,cd至目錄D:\dev_tools\nexus-webapp-1.3.0\bin\jsw\windows-x86-32 ,運行Nexus.bat 。你會看到Nexus的啟動日志,當你看到“Started SelectChannelConnector@0.0.0.0:8081”之后,說明Nexus啟動成功了,然后打開瀏覽器,訪問http://127.0.0.1:8081/nexus,你會看到如下的頁面:

    要停止Nexus,Ctrl+C即可,此外InstallNexus.bat可以用來將Nexus安裝成一個windows服務,其余的腳本則對應了啟動,停止,暫停,恢復,卸載Nexus服務。

     

    WAR方式安裝

    你需要有一個能運行的web容器,這里以Tomcat為例,加入Tomcat的安裝目錄位于D:\dev_tools\apache-tomcat-6.0.18 ,首先我們將下載的nexus-webapp-1.3.0.war 重命名為nexus.war ,然后復制到D:\dev_tools\apache-tomcat-6.0.18\webapps\nexus.war ,然后啟動CMD,cd到D:\dev_tools\apache-tomcat-6.0.18\bin\ 目錄,運行startup.bat 。一切OK,現在可以打開瀏覽器訪問http://www.bt285.cn :8080/nexus,你會得到和上圖一樣的界面。

     

    代理外部Maven倉庫

    登陸

    要管理Nexus,你首先需要以管理員身份登陸,點擊界面右上角的login,輸入默認的登錄名和密碼:admin/admin123,登陸成功后,你會看到左邊的導航欄增加了很多內容:

    這里,可以管理倉庫,配置Nexus系統,管理任務,管理用戶,角色,權限,查看系統的RSS源,管理及查看系統日志,等等。你會看到Nexus的功能十分豐富和強大,本文,筆者只介紹一些最基本的管理和操作。

     

    代理Maven中央倉庫

    點擊左邊導航欄的Repositories,界面的主面板會顯示所有一個所有倉庫及倉庫組的列表,你會看到它們的Type字段的值有group,hosted,proxy,virtual。這里我們不關心virtual,只介紹下另外三種類型:

    • hosted,本地倉庫,通常我們會部署自己的構件到這一類型的倉庫。
    • proxy,代理倉庫,它們被用來代理遠程的公共倉庫,如maven中央倉庫。
    • group,倉庫組,用來合并多個hosted/proxy倉庫,通常我們配置maven依賴倉庫組。

    由此我們知道,我們需要配置一個Maven中央倉庫的proxy,其實Nexus已經內置了Maven Central,但我們需要做一些配置。點擊倉庫列表中的Maven Central,你會注意到它的Policy是release,這說明它不會代理遠程倉庫的snapshot構件,這是有原因的,遠程倉庫的snapshot版本構件不穩定且不受你控制,使用這樣的構件含有潛在的風險。然后我們發現主面板下方有三個Tab,分別為Browse,Configuration和Mirrors,我們點擊Configuration進行配置,你現在需要關心的是兩個配置項:“Remote Storage Location”為遠程倉庫的地址,對于Maven Central來說是http://repo1.maven.org/maven2/;“Download Remote Indexes”顧名思義是指是否下載遠程索引文件,Maven Central的該字段默認為False,這是為了防止大量Nexus無意識的去消耗中央倉庫的帶寬(中央倉庫有大量的構件,其索引文件也很大)。這里我們需要將其設置為True,然后點擊Save。在Nexus下載的中央倉庫索引文件之后,我們就可以在本地搜索中央倉庫的所有構件。下圖展示了我們剛才所涉及的配置:

     

    添加一個代理倉庫

    這里我們再舉一個例子,我們想要代理Sonatype的公共倉庫,其地址為:http://repository.sonatype.org/content/groups/public/。步驟如下,在Repositories面板的上方,點擊Add,然后選擇Proxy Repository,在下方的配置部分,我們填寫如下的信息:Repository ID - sonatype;Repository Name - Sonatype Repository;Remote Storage Location - http://repository.sonatype.org/content/groups/public/。其余的保持默認值,需要注意的是Repository Policy,我們不想代理snapshot構件,原因前面已經描述。然后點擊Save。配置頁面如下:

     

    管理本地Maven倉庫

    Nexus預定義了3個本地倉庫,分別為Releases,Snapshots,和3rd Party。這三個倉庫都有各自明確的目的。Releases用于部署我們自己的release構件,Snapshots用于部署我們自己的snapshot構件,而3rd Party用于部署第三方構件,有些構件如Oracle的JDBC驅動,我們不能從公共倉庫下載到,我們就需要將其部署到自己的倉庫中。

    當然你也可以創建自己的本地倉庫,步驟和創建代理倉庫類似,點擊Repository面板上方的Add按鈕,然后選擇Hosted Repository,然后在下方的配置面板中輸入id和name,注意這里我們不再需要填寫遠程倉庫地址,Repository Type則為不可修改的hosted,而關于Repository Policy,你可以根據自己的需要選擇Release或者Snapshot,如圖:

     

    管理Maven倉庫組

    Nexus中倉庫組的概念是Maven沒有的,在Maven看來,不管你是hosted也好,proxy也好,或者group也好,對我都是一樣的,我只管根據groupId,artifactId,version等信息向你要構件。為了方便Maven的配置,Nexus能夠將多個倉庫,hosted或者proxy合并成一個group,這樣,Maven只需要依賴于一個group,便能使用所有該group包含的倉庫的內容。

    Nexus預定義了“Public Repositories”和“Public Snapshot Repositories”兩個倉庫組,前者默認合并所有預定義的Release倉庫,后者默認合并所有預定義的Snapshot倉庫。我們在本文前面的部分創建了一個名為“Sonatype Repository”的倉庫,現在將其合并到“Public Repositories”中。

    點擊倉庫列表中的“Public Repositories”,然后選擇下方的"Configuration" Tab,在配置面板中,將右邊“Avaiable Repositories”中的“Sonatype Repository”拖拽到左邊的“Ordered Group Repository”中,如圖:

    創建倉庫組和創建proxy及hosted倉庫類似,這里不再贅述。需要注意的是format字段需要填寫“maven2”,添加你感興趣的倉庫即可。

     

    搜索構件

    在浩大的Maven倉庫中一下下點擊鏈接,瀏覽路徑以尋找感興趣的構件是一件很郁悶的事情。Nexus基于nexus-indexer提供構件搜索功能,要想對倉庫進行搜索,無論是hosted,proxy,或者group,你都必須確認索引文件存在。這一點對于代理倉庫尤其重要,有些遠程倉庫可能根本就沒有索引,所以你無法搜索這些代理倉庫。有些遠程倉庫的遠程索引非常大,如中央倉庫達到了70M左右,那么第一次下載索引需要花很多時間,所以要期望得到搜索結果,確保看到如下的文件:

    一旦你的Nexus擁有了本地或者遠程倉庫的索引文件,你就可以享受Nexus的構件搜索功能了。不論登陸與否,你都可以使用關鍵字進行模糊搜索,比如我在左邊導航欄上部的搜索框內輸入junit,然后點擊搜索按鈕,右邊立刻會分頁顯示500多條的junit相關構件信息。如果你了解更多的信息,你也可以通過限定groupId,artifactId,version進行搜索,點擊導航欄中的“Advanced Search”,點擊右邊所有頁面左上角的下拉框,選擇“GAV Search”。筆者這里輸入junit:junit:4.4,然后回車:

    選擇一項搜索結果,在頁面下方會顯示“Artifact Information”的面板,你可以點擊"artifact"或者"pom"下載對應文件,而該面板右邊更顯示了一個Maven依賴配置,你可以直接復制該配置到Maven POM中,這是個十分方便的特性。

    此外,值得一提的是,Nexus還支持基于classname的搜索,你只需點擊搜索頁面右上角的下拉框,選擇“Classname Search”,然后輸入類名即可,這里我不再贅述。

     

    配置Maven使用Nexus

    默認情況下,Maven依賴于中央倉庫,這是為了能讓Maven開箱即用,但僅僅這么做明顯是錯誤的,這會造成大量的時間及帶寬的浪費。既然文章的前面已經介紹了如何安裝和配置Nexus,現在我們就要配置Maven來使用本地的Nexus,以節省時間和帶寬資源。

    我們可以將Repository配置到POM中,但一般來說這不是很好的做法,原因很簡單,你需要為所有的Maven項目重復該配置。因此,這里我將Repository的配置放到$user_home/.m2/settings.xml中:

    Xml代碼 復制代碼
    1. <settings>  
    2. ...   
    3. <profiles>  
    4.   <profile>  
    5.     <id>dev</id>  
    6.     <repositories>  
    7.       <repository>  
    8.         <id>local-nexus</id>  
    9.         <url>http://127.0.0.1:8080/nexus/content/groups/public/</url>  
    10.         <releases>  
    11.           <enabled>true</enabled>  
    12.         </releases>  
    13.         <snapshots>  
    14.           <enabled>true</enabled>  
    15.         </snapshots>  
    16.       </repository>  
    17.     </repositories>  
    18.   </profile>  
    19. </profiles>  
    20. <activeProfiles>  
    21.   <activeProfile>dev</activeProfile>  
    22. </activeProfiles>  
    23. ...   
    24. </settings>  

    由于我們不能直接在settings.xml中插入<repositories>元素,這里我們編寫了一個profile,并添加了一個profile并使用<activeProfile>元素自動將這個profile激活。這里的local-nexus倉庫指向了剛才我們配置的Nexus中“Public Repositories”倉庫組,也就是說,所有該倉庫組包含的倉庫都能供我們使用。此外,我們通過<releases>和<snapshots>元素激活了Maven對于倉庫所有類型構件下載的支持,當然你也可以調節該配置,比如說禁止Maven從Nexus下載snapshot構件。

    使用該配置,Maven就會從你的Nexus服務器下載構件了,速度和從Central下載可不是一個數量級的。

     

    部署構件至Nexus

    Nexus提供了兩種方式來部署構件,你可以從UI直接上傳,也可以配置Maven部署構件。

     

    通過Nexus UI部署

    有時候有個jar文件你無法從公共Maven倉庫找到,但是你能從其它得到這個jar文件(甚至是POM),那么你完全可以將這個文件部署到Nexus中,使其成為標準流程的一部分。步驟如下:

    點擊左邊導航欄的"Repository",在右邊的倉庫列表中選擇一個倉庫,如“3rd Party”,然后會看到頁面下方有四個tab,選擇最后一個“Upload”,你會看到構件上傳界面。選擇你要上傳的構件,并指定POM,(或者手工編寫GAV等信息),最后點擊Upload,該構件就直接被部署到了Nexus的"3rd Party"倉庫中。如圖:


    通過Maven部署

    更常見的用例是:團隊在開發一個項目的各個模塊,為了讓自己開發的模塊能夠快速讓其他人使用,你會想要將snapshot版本的構件部署到Maven倉庫中,其他人只需要在POM添加一個對于你開發模塊的依賴,就能隨時拿到最新的snapshot。

    以下的pom.xml配置和settings.xml能讓你通過Maven自動化部署構件:

    pom.xml

    Xml代碼 復制代碼
    1. <project>  
    2. ...   
    3. <distributionManagement>  
    4.   <repository>  
    5.     <id>nexus-releases</id>  
    6.       <name>Nexus Release Repository</name>  
    7.       <url>http://127.0.0.1:8080/nexus/content/repositories/releases/</url>  
    8.   </repository>  
    9.   <snapshotRepository>  
    10.     <id>nexus-snapshots</id>  
    11.     <name>Nexus Snapshot Repository</name>  
    12.     <url>http://127.0.0.1:8080/nexus/content/repositories/snapshots/</url>  
    13.   </snapshotRepository>  
    14. </distributionManagement>  
    15. ...   
    16. </project>  

    settings.xml

    Xml代碼 復制代碼
    1. <settings>  
    2. ...   
    3. <servers>  
    4.   <server>  
    5.     <id>nexus-releases</id>  
    6.     <username>admin</username>  
    7.     <password>admin123</password>  
    8.   </server>  
    9.   <server>  
    10.     <id>nexus-snapshots</id>  
    11.     <username>admin</username>  
    12.     <password>admin123</password>  
    13.   </server>     
    14. </servers>  
    15. ...   
    16. </settings>  

    這里我們配置所有的snapshot版本構件部署到Nexus的Snapshots倉庫中, 所有的release構件部署到Nexus的Releases倉庫中。由于部署需要登陸,因為我們在settings.xml中配置對應Repository id的用戶名和密碼。

    然后,在項目目錄中執行mvn deploy ,你會看到maven將項目構件部署到Nexus中,瀏覽Nexus對應的倉庫,就可以看到剛才部署的構件。當其他人構建其項目時,Maven就會從Nexus尋找依賴并下載。

     

    總結

    本文介紹強大的倉庫管理器——Nexus,包括如何下載安裝Nexus,配置Nexus代理中央倉庫,管理Nexus的代理倉庫,本地倉庫,以及倉庫組。并幫助你了解如何通過Nexus搜索構件。最后,如何在Maven中配置Nexus倉庫,以及如何部署構件到Nexus倉庫中。這些都是Nexus中最基本也是最常用的功能。隨著使用的深入,你會發現Nexus還有很多其它的特性,如用戶管理,角色權限管理等等。

    Nexus的OSS版本是完全開源的,如果你有興趣,你可以學習其源碼,甚至自己實現一個REST客戶端。

    馬上擁抱Nexus吧,它是免費的!

    posted @ 2009-03-16 18:51 wang9354| 編輯 收藏

    導航

    <2009年3月>
    22232425262728
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    統計

    常用鏈接

    留言簿(2)

    隨筆檔案

    友情鏈接

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲欧美国产精品专区久久| 亚洲福利视频网站| 国产精品亚洲专区无码WEB| 性xxxxx免费视频播放| 亚洲伦另类中文字幕| 久久成人免费电影| 亚洲国产精品久久久久婷婷软件 | 亚洲精品天堂成人片AV在线播放| 亚洲视频在线免费播放| 亚洲视频国产精品| 免费观看黄色的网站| 亚洲av永久无码精品天堂久久| 91黑丝国产线观看免费| 亚洲a∨无码男人的天堂| 免费网站看v片在线香蕉| 自拍偷自拍亚洲精品播放| 亚洲国产精品人人做人人爽 | 亚洲最大av资源站无码av网址| 国产免费av片在线看| 亚洲另类自拍丝袜第五页| 又爽又黄无遮挡高清免费视频| 国产免费播放一区二区| 亚洲Av无码专区国产乱码DVD| 18禁止看的免费污网站| 亚洲成_人网站图片| 亚洲国产aⅴ综合网| a级大片免费观看| 亚洲精品在线播放视频| 午夜小视频免费观看| 一级做a毛片免费视频| 亚洲av无码不卡| 无码少妇一区二区浪潮免费| 国产在亚洲线视频观看| 国产偷v国产偷v亚洲高清| 91免费国产自产地址入| 亚洲精品欧美综合四区| 成人午夜亚洲精品无码网站| 青青草a免费线观a| 一级毛片视频免费| 亚洲免费网站在线观看| 亚洲成av人在片观看|