servlet相關 jar包位置 BAE上部署web應用


1手動編譯servlet工程:

 要編譯servlet,則類路徑classpath中必須包括Servlet API 的相關類,如果使用的web容器是Tomcat,則這些類通常封裝在在tomcatlib目錄中servlet-api.jar。上面的編譯出的.class文件會出現在buildclasses目錄中,並有對應的包層級。(上一篇隨筆已討論過,如果系統classpath設置第三方jar包路徑了,編譯時就不需手動加上包路徑)

Eclipse這種IDE會自動完成類路徑設置,並完成編譯等事宜。

 

如何引入tomcatlibjar包,如常用的tomcat-api.jar

項目右鍵Build path --Add Library選擇 Server runtime ,next后點擊Apache Tomcat .OK

操作完成后,工程Libries下就有了Apache Tomcat

對於sqljdbc4.jar包所放位置問題

(1)普通的Java Project:

  右鍵構建路徑添加擴展包,找到sqljdbc4.jar所在位置。結果如下圖。

(2)動態網站

放在WEB-INF/lib.

注意:復制包到WEB-INF/lib下,會發現Libraries下的Web App Libraries就有了相應jar包。

說明:web-inf下的lib目錄:主要存放我們web程序下需實現某個功能所需要的jar包。.WEB-INF 是WEB容器路徑,也就是說,當把應用部署到網絡上去的時候。程序會到WEB-INF\LIB 下去找相應的包。 jar包:ar包就是別人已經寫好的一些類,然后將這些類進行打包,你可以將這些jar包引入你的項目中,然后就可以直接使用這些jar包中的類和屬性了,這些jar包一般都會放在lib目錄下的。 如:文件上傳功能需要使用到commons-fileupload-1.2.1.jar,commons-io-1.3.2.jar。連接Oracle數據庫需要使用到ojdbc14.jar

 

不同工程jar所放位置不同分析原因:

通俗的講是和classLoader有關,對於純java項目,它不存在WEB-INF目錄,所以在引入jar包的時候一般都是通過buildpath直接引入,例如我要引入sqljdbc4.jar,那么先定義一個user library,然后通過build path引入。

java項目使用的本地自己的JRE,那么classLoader在加載jarclass時候是分開的,對於我們自己編寫的class,會在APP_HOME/bin下。導入的jar包或者user library的配置信息會出現在APP_HOME/.classpath文件中,ClassLoader會很智能去加載這些classesjar

.classpath文件內容如下:

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

<classpath>

<classpathentry kind="src" path="src"/>

<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>

<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/lei"/>

<classpathentry kind="output" path="bin"/>

</classpath>

 

而對於java web項目,就不一樣了,雖然eclipseworkspace中仍然有.classpath文件,你導入的了自己定義的user library,也會出現在.classpath中,但就是不去加載。這到底是為什么呢???

對於java web項目,它最終不是通過本地的JRE去運行,而是部署到web 服務器,如TomcatWeblogicWebSphere等,這些服務器都實現了自身的類加載器。

Tomcat典型結果為例,它的目錄結構分別對應四個不同的類加載器,關系如下:

common --- CommonClassLoader

server --- CatalinaClassLoader

shared --- SharedClassLoader

webapps --- WebappClassLoader

我們的 web 應用都是部署到 webapps 目錄下,而WebappClassLoader加載器專門負責加載 webapps 下所有web項目的 WEB-INF 下的類庫和類文件。而我們通過 user library 引入的 jar 包自然不會被 WebappClassLoader 加載器加載,所以才會出現 ClassNotFoundException 

 

比如tomcat應用服務器,它有其自己的類加載器,根據J2EE的規范去%web-project%/WEB-INF/lib的規范去找相應的lib,這就是為什么我們發布的WEB應用要符合那個格式

 

另有說法:eclipse工程下的library是用來編譯里面的src中java文件的 實際發布到tomcat時,僅僅只復制了WEB-INF/lib里面的jar包,所以出現eclipse可以正常編譯但tomcat運行是找不到類,

 

總結:如果是編譯java代碼用到的jar可以作為library引用,如果是框架非java代碼部分用到的jar就必須放在WEB-INF/lib

3. 使用標注(@WebServlet("/Servlet3"))來定義Servlet是Java EE 6中 Servlet 3.0之后才有的功能,先前的版本必須通過web.xml定義相關Servlet信息。在Servlet3.0中,也可以使用web.xml來定義servlet,會覆蓋掉標注。

   

  <servlet>

    <servlet-name>Serv</servlet-name>

    <servlet-class>com.lei.Servlet3</servlet-class>

</servlet>

<servlet-mapping>

    <servlet-name>Serv</servlet-name>

    <url-pattern>/myservlet1</url-pattern>

</servlet-mapping>

注意: <servlet-name>可以為任意名字。

注意:建工程的時候,自動生成的web.xml在哪WEB-INF下

二 . BAE

 

實驗算是成功,外網可以訪問到了。后期可以學學連mysql,BAE支持這個數據庫。

 

問題:1 目前只能是新建個版本,svn check out下來 ,按默認的目錄把相應文件放進去,這相當於是BAE幫我們維護的文件組織形式。

Src放的是源碼即.java文件,里面是BAE默認的包結構,可以整個替換src目錄。

Svn commit后,會提交到BAEBAE后台會幫我們編譯(支持JAVA,就是說明有JAVA編譯器)有錯誤在雲平台也可以查看。至於編譯后的目錄我們無法查看

(即看不到編譯后的.class文件)。不像在本地編譯好后,我們可以查看發布到tomcat的包結構。

WEB-INF目錄進去,classes放的是編譯好的.class文件。

(本地的tomcat的webapps中放置的是部署到Tomcat的編譯過的組織結構)

 

BAE幫助文檔中說

所用的web容器是jetty,當用戶通過SVN更新項目代碼后,執行環境自動將編譯為標准的WAR包后發布。

不同容器維護的工程結構不同,所以不能直接上傳由eclipse導出的war包。不支持,所以無法訪問。

 

注意,目前BAE不支持servlet標注定義servleturl。只能通過web.xml來配置。所以eclipse生成的標記通過svn上傳時可以刪掉,不刪也沒影響,但是必須在xml中配置好。

 

 

三 SAE目前沒成功


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM