几种javaweb容器的配置备忘

   

1 JBOSS端口更改

1.到jboss-4.2.3.GAserverdefaultdeployjboss-web.deployer下,打开server.xml,修改默认的8080端口为8081.

2.然后到jboss-4.2.3.GAserverdefaultconfjboss-service.xml 修改相应的同那个监控软件自带的jboss冲突的端口.

1 (96).jpg

3.然后到jboss-4.2.3.GAbin下重新运行run.bat 即可重新启动了.

<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

2JBoss的两种类隔离机制配置说明

EAR or WAR的类将按照以下顺序装载:

1. WEB-INF/lib (for WARs)

2. server/default/lib下的jar包

3. tomcat的jar包server/default/deploy/jbossweb-tomcatxxx.sar,与server/default/lib将混合在一起,不区别顺序。

在部署应用到JBoss服务器时,通常见到的问题就是应用所带的jar包与容器自己的jar包版本不同导致的冲突,以及应用间jar包导致的冲突,JBOSS提供两种隔离机制:

1. 部署包之间的隔离

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_HOMElib下面的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之后,将会优先加载下面的两个目录
1、D:jbossserverdefaultlib

2、D:jbossserverdefaulttmpdeploy

但是上面三组均不在以上1 2 所指的2个目录中。接着看......
找到如下文件,注意这个文件里面蕴藏着jar加载的有一个规则.
jboss-4.2.3.GAserverdefaultconfxmdesc 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

6tomcat修改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下面。其中:

%CATALINA%这是Tomcat的根目录 <ENGINE>在server.xml里可以通过<ENGINE> 标签的name属性看到,Catalina是Tomcat的默认名称 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全局数据源的配置

1、在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地址修改


2、对于全局数据源的引用,在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的相关内容。