幾種javaweb容器的配置備忘

1 JBOSS端口更改

1.到jboss-4.2.3.GA\server\default\deploy\jboss-web.deployer下,打開server.xml,修改默認的8080端口爲8081.  html

2.而後到jboss-4.2.3.GA\server\default\conf\jboss-service.xml 修改相應的同那個監控軟件自帶的jboss衝突的端口. java

3.而後到jboss-4.2.3.GA\bin下從新運行run.bat 便可從新啓動了. mysql

<Connector port="8082" address="${jboss.bind.address}"    
         maxThreads="250" maxHttpHeaderSize="8192"
         emptySessionPath="true" protocol="HTTP/1.1"
         enableLookups="false" redirectPort="8443" acceptCount="100"
         connectionTimeout="20000" disableUploadTimeout="true"  />

參考文檔:http://chris-wang.iteye.com/blog/285668 web

2 JBoss的兩種類隔離機制配置說明

EAR or WAR的類將按照如下順序裝載: spring

1. WEB-INF/lib (for WARs) sql

2. server/default/lib下的jar包 shell

3. tomcat的jar包server/default/deploy/jbossweb-tomcatxxx.sar,與server/default/lib將混合在一塊兒,不區別順序。 數據庫

在部署應用到JBoss服務器時,一般見到的問題就是應用所帶的jar包與容器本身的jar包版本不一樣致使的衝突,以及應用間jar包致使的衝突,JBOSS提供兩種隔離機制: apache

1. 部署包之間的隔離 windows

2. 覆蓋JBoss Server的類的隔離

A部署包之間的隔離機制

對於.ear部署包,咱們應該修改jboss-app.xml以下:

<jboss-app>    
   <loader-repository>     
   com.example:archive=unique-archive-name     
   </loader-repository>     
</jboss-app>

對於.war部署包,在jboss-web.xml中定義以下:

<jboss-web>    
   <class-loading>     
      <loader-repository>     
      com.example:archive=unique-archive-name     
      </loader-repository>     
   </class-loading>    
</jboss-web>   

在JBoss 4.2.1中<class-loading>再也不被支持,而4.0.5兩種方式都支持,直接修改成:

<jboss-web>    
   <loader-repository>     
      com.example:archive=unique-archive-name     
   </loader-repository>     
</jboss-web>     

在.sar部署包中,在jboss-service.xml定義以下:

<server>    
     <loader-repository>    
          com.example:archive=unique-archive-name     
     </loader-repository>    
</server>    

示例中,com.example:archive=unique-archive-name表明jar倉庫的對象名objectName ,其中,com.example能夠隨意取,unique-archive-name 就用部署包的名字便可,例如com.example:archive=helloworld.sar,保證這一串惟一便可。而com.example將出如今JMX-Console (http://localhost:8080/jmx-console/)列出的節點上(每一個節點爲一個LoaderRepository domain:jar參考的域概念,其實就是一個全部jar容器倉庫的分組概念)

對於部署包內內嵌了其餘部署包,只有最上層的部署描述配置才起做用,例如:

.ear中包含了.sar和.war,這隻有.ear中的META-INF/jboss-app.xml 中定義的隔離範圍纔會起做用。

.sar中包含了.war,則只有.sar META-INF/jboss-service.xml中定義的隔離範圍才起做用

B 覆蓋JBoss Server的類的隔離

對於jboss-app.xml:

<jboss-app>    
  <loader-repository>     
  com.example:archive=unique-archive-name     
     <loader-repository-config>     
     java2ParentDelegation=false     
     </loader-repository-config>     
  </loader-repository>    
</jboss-app>

對於jboss-web.xml:

<jboss-web>    
 <class-loading java2ClassLoadingCompliance="false">    
 <loader-repository>    
        com.example:archive=unique-archive-name    
        <loader-repository-config>java2ParentDelegation=false</loader-repository-config>    
 </loader-repository>    
 </class-loading>  
...

jboss-service.xml:

<server>    
 <loader-repository>    
        com.example:archive=unique-archive-name    
        <loader-repository-config>java2ParentDelegation=false</loader-repository-config>    
 </loader-repository>    
 ...

參考文檔:http://developer.51cto.com/art/201001/179092.htm

3 Jboss jar包衝突及jar加載順序  

將一個完整的.war包部署到Jboss容器中,啓動後報以下錯誤:
15:04:48,632 ERROR [ContextLoader] Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.apache.activemq.xbean.XBeanBrokerService#0' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.slf4j.MDC.getCopyOfContextMap()Ljava/util/Map;
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1338)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
        at java.security.AccessController.doPrivileged(Native Method)
$find . -name slf4j*.jar                      
./bin/configuration/org.eclipse.osgi/bundles/24/1/.cp/slf4j-log4j12-1.4.3.jar
./bin/configuration/org.eclipse.osgi/bundles/24/1/.cp/slf4j-api-1.4.3.jar
./server/default/deploy/configuration/org.eclipse.osgi/bundles/14/1/.cp/slf4j-log4j12-1.4.3.jar
./server/default/deploy/configuration/org.eclipse.osgi/bundles/14/1/.cp/slf4j-api-1.4.3.jar
./server/default/deploy/etl_sngps.war/WEB-INF/lib/slf4j-api-1.6.1.jar
./server/default/deploy/etl_sngps.war/WEB-INF/lib/slf4j-log4j12-1.6.1.jar
./server/default/deploy/jboss-web.deployer/configuration/org.eclipse.osgi/bundles/14/1/.cp/slf4j-log4j12-1.4.3.jar
./server/default/deploy/jboss-web.deployer/configuration/org.eclipse.osgi/bundles/14/1/.cp/slf4j-api-1.4.3.jar

查看Jboss jar加載文檔:

1)        org.jboss.Main.main(String[]) 爲入口. 
2)        main 函數建立一個名叫」jboss」的線程組, 而後建立一個屬於該組的線程, 在線程中執行boot方法. 
3)        boot 方法首先處理main函數中的參數(及一些其它的系統環境設置), 接着就用系統的屬性建立了org.jboss.system.server.ServerLoader實例[new ServerLoader(props)]. 
4)        ServerLoader 註冊Jboss相關的類路徑, 包括XML解析器, jboss-jmx.jar, concurrent.jar及其它的一些額外的類路徑. 
這裏通常都是在JBOSS_HOME\lib下面的jar. 
5)        ServerLoader 經過load(ClassLoader)方法建立Jboss Server實例. 參數ClassLoader是ClassLoader parentCL = Thread.currentThread(). getContextClassLoader( )獲得的當前線程的類加載器. 建立的Server實例是org.jboss.system.server.Server接口的實現. load(ClassLoader)方法的細節: 
?  用jar包及在ServerLoader中註冊的類路徑建立一個URLClassLoader的實例, 把傳入的ClassLoader做爲該URLClassLoader的parent. 
?  Server 接口的實現類由系統屬性 jboss.server.type決定, 默認是 org.jboss.system.server.ServerImpl. 
?  URLClassLoader 經過無參構造函數加載Server接口實現的實例. 在加載前把當前線程的類加載器置爲該URLClassLoader, 在加載完成後再置回以前傳入的ClassLoader. 
6)        Server 實例用系統屬性進行初始化[server.init(props)]. 
7)        服務起動[server.start()]. 起動過程的默認實現以下: 
?  把當前線程類型加載器置爲加載該Server接口實現實例的ClassLoader. 
?  在jboss域內, 經過MBeanServerFactory的createMBeanServer(String)方法建立MbeanServer實例. 
?  在MBean Server上註冊ServerImpl和ServerConfigImpl兩個MBean. 
?  初始化統一的類加載倉庫(unified class loader repository), 用來裝載服務器配置目錄及其它可選目錄下的jar文件. 對於每個jar文件和類目錄都會建立一個相應的org.jboss.jmx.loading.UnifiedClassLoader實例, 而且註冊到統一的倉庫中. 其中一個UnifiedClassLoader實例會被設置爲當前線程上下文的ClassLoader. [?: This effectively makes allUnifiedClassLoaders available through the thread context class loader.] 

?  接下來建立org.jboss.system.ServiceController的MBean實例. ServiceController管理JBoss MBean服務的生命週期. 


須要注意的是:JBOSS在加載自帶的核心JAR以後,將會優先加載下面的兩個目錄 
一、D:\jboss\server\default\lib 

二、D:\jboss\server\default\tmp\deploy 

可是上面三組均不在以上1 2 所指的2個目錄中。接着看......
找到以下文件,注意這個文件裏面蘊藏着jar加載的有一個規則.
\jboss-4.2.3.GA\server\default\conf\xmdesc org.jboss.deployment.MainDeployer-xmbean.xml
最早加載的是後綴名爲deployer目錄下應用或者服務;
250:.rar,300:-ds.xml,400:.jar,500:.war,550:.jse,650:.ear,800:.bsh
<descriptors>
         <value value="250:.rar,300:-ds.xml,400:.jar,500:.war,550:.jse,650:.ear,800:.bsh"/>
</descriptors>
能夠經過調整這個value來改變加載規則。

這裏已經很清楚了,上面所引爆的問題,正是因爲/jboss-web.deployer下面所用的1,4版本致使的。刪除後,一切正常。


參考文檔:http://blog.csdn.net/mypop/article/details/6617914

4 Windows怎麼查看端口占用狀況

在windows命令行窗口下執行:

C:\>netstat -aon|findstr "9050"

TCP    127.0.0.1:9050         0.0.0.0:0              LISTENING       2016

C:\>tasklist|findstr "2016"

tor.exe                     2016 Console                 0     16,064 K

5 tomcat更改端口

  (1)、在Tomcat安裝根目錄下的字文件夾conf中找到文件server.xml

  (2)、將其用記事本程序打開,找到這段文字:

<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->

        <Connector port="8080" maxHttpHeaderSize="8192"

                   maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

                   enableLookups="false" redirectPort="8443" acceptCount="100"

                   connectionTimeout="20000" disableUploadTimeout="true" />

將以上文字中的Connector port="8080"中的8080更改成8888便可,從新啓動Tomcat,使用http://localhost:8888登陸,發現問題已解決。

參考文檔:http://blog.sina.com.cn/s/blog_4d83777b0100fgp0.html

6 tomcat修改manager

修改tomcat-users.xml文件,在其中添加管理員角色(manager),以及管理員用戶(admin)和密碼(admin),修改後以下:

<tomcat-users>

<role rolename="manager"/>

<user name="tomcat" password="tomcat" roles="tomcat" />

<user name="role1" password="tomcat" roles="role1" />

<user name="both" password="tomcat" roles="tomcat,role1" />

<user username="admin" password="admin" roles="manager"/>

</tomcat-users>

最後,重啓tomcat,在進入管理頁面的時候,用管理員用戶admin和密碼admin,登錄ok。

7 Tomcat 6 數據源配置

方法1:

修改$CATALINA_HOME/conf/context.xml文件,加入以下代碼:

<Context reloadable="true"> 
    <WatchedResource>WEB-INF/web.xml</WatchedResource> 
    <Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource" 
     maxActive="100" maxIdle="30" maxWait="10000" username="root" password="root" driverClassName="com.mysql.jdbc.Driver" 
     url="jdbc:mysql://localhost:3306/dataBaseName"/>
</Context>
jdbc/mysql  可本身設置,dataBaseName 更改成相關數據庫名

把MYSQL驅動拷貝到TOMCAT的lib目錄(我用的是mysql-connector-java-5.1.6-bin.jar)

沒必要像官方文檔所說,在web應用的web.xml中配置<resource-ref>標籤的屬性,數據源就配置成功。

java代碼以下:

Context initCtx = new InitialContext();
javax.sql.DataSource ds = (javax.sql.DataSource)initCtx.lookup("java:comp/env/jdbc/mysql");
Connection conn = ds.getConnection();
Context元素表明一個web應用,運行在某個特定的虛擬主機上。你能夠在一個Host元素中嵌套任意多的Context元素。每一個Context的路徑必須是唯一的,由path屬性定義。

若針對某個WEB應用配置數據源,可在$CATALINA_HOME/conf/server.xml文件中的<Host></Host>標籤之間加入以下的Context代碼:

<Context path="/path" docBase="systemPath" reloadable="true">
    <Resource
        name="jdbc/mysql"
        auth="Container"
        type="javax.sql.DataSource"
        maxActive="100"
        maxIdle="30"
        maxWait="10000"
        username="root"
        password="root"
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/dataBaseName"/>
</Context>

方法2:

咱們能夠把 Context 片段以<path>.xml保存在%CATALINA%/conf/<ENGINE>/<HOST>/文件下面。好比:我經過URL訪問的應用的路徑是:[url]http://localhost/test/[/url],那麼,Context的文件名稱爲test.xml。把text.xml保存到%CATALINA%/conf/Catalina/localhost下面。其中:

  1. %CATALINA%這是Tomcat的根目錄
  2. <ENGINE>在server.xml裏能夠經過<ENGINE> 標籤的name屬性看到,Catalina是Tomcat的默認名稱
  3. localhost是虛擬主機的名稱了。這個在server.xml裏也能夠查看獲得。
另外,還應該在咱們應用的web.xml(也就不是tomcat根目錄下的conf/web.xml)裏面加入資源引用:(好像不加也能夠吧。Tomcat的文檔裏面都添加了。)
<resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/TomcatHibernate</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
  </resource-ref>

%CATALINA%/webapps/test/WEB-INF/web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee [url]http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd[/url]"
    version="2.5">

  <resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/TomcatHibernate</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
  </resource-ref>

</web-app>
%CATALINA%/conf/Catalina/localhost/test.xml
<Context>
    <Resource name="jdbc/TomcatHibernate" auth="Container" type="javax.sql.DataSource" 
          maxActive="100" maxIdle="30" maxWait="10000" 
         username="root" password="admin" driverClassName="com.mysql.jdbc.Driver" 
          url="jdbc:mysql://localhost:3306/hibernate"/>
 </Context>

%CATALINA%/webapps/test/test.jsp


<%@ page language="java" pageEncoding="GB2312"%>
<%@ page import="java.sql.*, javax.sql.*, javax.naming.*" %>
<%
    Connection conn = null;
    String url = "jdbc:mysql://localhost:3306/hibernate";
    String user = "root";
    String password = "admin";
    try {
        InitialContext ctx = new InitialContext();
        DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/TomcatHibernate");
        conn = ds.getConnection();
        if(conn != null) {
            out.println("數據源jdbc/hibernate配置成功!");
        }
    } catch(Exception e) {
        out.println("數據源jdbc/hibernate配置失敗!" + e);
    } finally {
        if(conn != null)
            conn.close();
    }
%>


這種解決方法的好處是:Context能夠獨立配置,不用修改Tomcat默認的server.xml context.xml等。

參考文檔:http://jetshi0125.blog.51cto.com/392919/110769/

8 TOMCAT6全局數據源的配置

一、在TOMCAT_HOME/conf/server.xml中的<GlobalNamingResources>的節點中添加以下內容:

<Resource name="jdbc/bn" auth="Container" type="javax.sql.DataSource"
               maxActive="100" maxIdle="30" maxWait="1000"
               username="sa" password="654321" driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
               url="jdbc:sqlserver://127.0.0.1:1433;databaseName=testDB"/>

以上爲MSSQLSERVER數據庫,url爲數據鏈接地址,請據本身IP地址修改


二、 對於全局數據源的引用,在TOMCAT_HOME/conf/context.xml中添加以下內容:

<ResourceLink name="jdbc/TestDB" global="jdbc/TestDB" type="javax.sql.DataSource"/>
3 使用的代碼以下:

private void initDAO() {
  try {
   Context initCtx = new InitialContext();
   Context envCtx = (Context) initCtx.lookup("java:comp/env");
   DataSource ds = (DataSource) envCtx.lookup("jdbc/bn"); 
   conn = ds.getConnection();
  }
  catch(Exception e) {
   e.printStackTrace();
  }
 }
若是是使用 Spring HibernateDaoSupport

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName">
            <value>java:comp/env/jdbc/bn</value>
        </property>
    </bean>

參考文檔:http://blog.csdn.net/gl74gs48/article/details/1832585


總結一下,這裏主要介紹了集中關於jboss相關配置及類加載的內容。後期填加些tomcat的相關內容。

相關文章
相關標籤/搜索