怎么用Java来实现控制Tomcatmt4 ea 启动停止控制与停止

飞翔的拖鞋up
&&&&Tomcat自带的${tomcat.home}/webapps/manager应用提供了对应用的管理功能,如
列出已部署应用
重新加载应用
部署新的应用
&&&&那么我们如何在程序中也能够实如上功能呢?
&&&&首先,这种操作对Tomcat来说是一种危险的行为,应为这样能够对Tomcat的内部信息进行直接操作。所以,Tomcat采用了授权的策略${tomcat.home}/conf/catalina.policy,策略文件摘要如下:
//WEB应用的权限
//&==========&WEB&APPLICATION&PERMISSIONS&=====================================
//默认的WEB应用都有这些权限,另外,应用程序可以访问文件系统和JNDI权限
&&&&//&Required&for&JNDI&lookup&of&named&JDBC&DataSource's&and
&&&&//&javamail&named&MimePart&DataSource&used&to&send&mail
&&&&permission&java.util.PropertyPermission&&java.home&,&&read&;
&&&&//&OS&Specific&properties&to&allow&read&access
&&&&permission&java.util.PropertyPermission&&os.name&,&&read&;
&&&&//&JVM&properties&to&allow&read&access
&&&&permission&java.util.PropertyPermission&&java.version&,&&read&;
&&&&//&Required&for&OpenJMX
&&&&permission&java.lang.RuntimePermission&&getAttribute&;
&&&&//&Allow&read&of&JAXP&compliant&XML&parser&debug
&&&&permission&java.util.PropertyPermission&&jaxp.debug&,&&read&;
&&&&//&All&JSPs&need&to&be&able&to&read&this&package
&&&&permission&java.lang.RuntimePermission&&accessClassInPackage.org.apache.tomcat&;
&&&&//&Precompiled&JSPs&need&access&to&these&packages.
&&&&permission&java.lang.RuntimePermission&&accessClassInPackage.org.apache.jasper.el&;
&&&&//&Precompiled&JSPs&need&access&to&these&system&properties.
&&&&permission&java.util.PropertyPermission
&&&&&&org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER&,&&read&;
&&&&//&The&cookie&code&needs&these.
&&&&permission&java.util.PropertyPermission
&&&&&&org.apache.catalina.STRICT_SERVLET_COMPLIANCE&,&&read&;
&&&&//&Applications&using&Comet&need&to&be&able&to&access&this&package
&&&&permission&java.lang.RuntimePermission&&accessClassInPackage.org.et&;
&&&&//&Applications&using&the&legacy&WebSocket&implementation&need&to&be&able&to&access&this&package
&&&&permission&java.lang.RuntimePermission&&accessClassInPackage.org.apache.catalina.websocket&;
&&&&//&Applications&using&the&JSR-356&WebSocket&implementation&need&to&be&able&to&access&these&packages
&&&&permission&java.lang.RuntimePermission&&accessClassInPackage.org.apache.tomcat.websocket&;
//file:${catalina.base}/webapps/manager/应用的权限
grant&codeBase&&file:${catalina.base}/webapps/manager/-&&{
&&&&permission&java.lang.RuntimePermission&&accessClassInPackage.org.apache.catalina&;
&&&&permission&java.lang.RuntimePermission&&accessClassInPackage.org.apache.catalina.ha.session&;
&&&&permission&java.lang.RuntimePermission&&accessClassInPackage.org.apache.catalina.manager&;
&&&&permission&java.lang.RuntimePermission&&accessClassInPackage.org.apache.catalina.manager.util&;
&&&&permission&java.lang.RuntimePermission&&accessClassInPackage.org.apache.catalina.util&;
grant&codeBase&&file:${catalina.home}/webapps/manager/-&&{
&&&&permission&java.lang.RuntimePermission&&accessClassInPackage.org.apache.catalina&;
&&&&permission&java.lang.RuntimePermission&&accessClassInPackage.org.apache.catalina.ha.session&;
&&&&permission&java.lang.RuntimePermission&&accessClassInPackage.org.apache.catalina.manager&;
&&&&permission&java.lang.RuntimePermission&&accessClassInPackage.org.apache.catalina.manager.util&;
&&&&permission&java.lang.RuntimePermission&&accessClassInPackage.org.apache.catalina.util&;
&那么我们该如何给应用赋予特殊的权限呢?我们首先看看Manager的应用是如何管理的,下载,打开org.apache.catalina.manager.HTMLManagerServlet,就可发现这是一个提供管理功能的一个servlet,管理功能代码如下,使用post的方式请求:
public&final&class&HTMLManagerServlet&extends&ManagerServlet&{
//...................代码省略
&&&&public&void&doPost(HttpServletRequest&request,
&&&&&&&&&&&&&&&&&&&&&&HttpServletResponse&response)
&&&&&&&&throws&IOException,&ServletException&{
&&&&&&&&StringManager&smClient&=&StringManager.getManager(
&&&&&&&&&&&&&&&&Constants.Package,&request.getLocales());
&&&&&&&&//&Identify&the&request&parameters&that&we&need
&&&&&&&&//&By&obtaining&the&command&from&the&pathInfo,&per-command&security&can
&&&&&&&&//&be&configured&in&web.xml
&&&&&&&&String&command&=&request.getPathInfo();
&&&&&&&&String&path&=&request.getParameter(&path&);
&&&&&&&&ContextName&cn&=&
&&&&&&&&if&(path&!=&null)&{
&&&&&&&&&&&&cn&=&new&ContextName(path,&request.getParameter(&version&));
&&&&&&&&String&deployPath&=&request.getParameter(&deployPath&);
&&&&&&&&ContextName&deployCn&=&
&&&&&&&&if&(deployPath&!=&null)&{
&&&&&&&&&&&&deployCn&=&new&ContextName(deployPath,
&&&&&&&&&&&&&&&&&&&&request.getParameter(&deployVersion&));&
&&&&&&&&String&deployConfig&=&request.getParameter(&deployConfig&);
&&&&&&&&String&deployWar&=&request.getParameter(&deployWar&);
&&&&&&&&//&Prepare&our&output&writer&to&generate&the&response&message
&&&&&&&&response.setContentType(&text/&charset=&&+&Constants.CHARSET);
&&&&&&&&String&message&=&&&;
&&&&&&&&if&(command&==&null&||&command.length()&==&0)&{
&&&&&&&&&&&&//&No&command&==&list
&&&&&&&&&&&&//&List&always&displayed&-&&do&nothing
&&&&&&&&}&else&if&(command.equals(&/upload&))&{
&&&&&&&&&&&&message&=&upload(request,&smClient);
&&&&&&&&}&else&if&(command.equals(&/deploy&))&{
&&&&&&&&&&&&message&=&deployInternal(deployConfig,&deployCn,&deployWar,
&&&&&&&&&&&&&&&&&&&&smClient);
&&&&&&&&}&else&if&(command.equals(&/reload&))&{
&&&&&&&&&&&&message&=&reload(cn,&smClient);
&&&&&&&&}&else&if&(command.equals(&/undeploy&))&{
&&&&&&&&&&&&message&=&undeploy(cn,&smClient);
&&&&&&&&}&else&if&(command.equals(&/expire&))&{
&&&&&&&&&&&&message&=&expireSessions(cn,&request,&smClient);
&&&&&&&&}&else&if&(command.equals(&/start&))&{
&&&&&&&&&&&&message&=&start(cn,&smClient);
&&&&&&&&}&else&if&(command.equals(&/stop&))&{
&&&&&&&&&&&&message&=&stop(cn,&smClient);
&&&&&&&&}&else&if&(command.equals(&/findleaks&))&{
&&&&&&&&&&&&message&=&findleaks(smClient);
&&&&&&&&}&else&{
&&&&&&&&&&&&//&Try&GET
&&&&&&&&&&&&doGet(request,response);
&&&&&&&&&&&&
&&&&&&&&list(request,&response,&message,&smClient);
&&&&//...................代码省略
org.apache.catalina.manager.HTMLManagerServlet&不可以继承,所以我们要实现类似的功能,我们要自己继承
org.apache.catalina.manager.ManagerServlet,代码如下
import&javax.servlet.annotation.WebS
import&org.apache.catalina.manager.ManagerS
@WebServlet(name=&customServlet&,urlPatterns={&/customServlet&})
public&class&CustomServlet&extends&ManagerServlet{
这个ManagerServlet&如果被自己的应用所继承的话,会报一个错误,如下:
: Restricted (ContainerServlet) class ************************
可以通过在${webapp}/META-INF/下,新增一个context.xml配置文件,去声明权限:
&!--&privileged=&true&&特别的权限&&--&
&Context&reloadable=&false&&delegate=&true&&privileged=&true&/&
reloadable=&true&则表示项目有变动时候会自动加载,如果要访问tomcat,最重要的是privileged=&true&,默认是false,由于安全性原因,false是无法访问Tomcat的API的。
项目结构如下:
&dependency&
&groupId&org.apache.tomcat&/groupId&
&artifactId&tomcat-catalina&/artifactId&
&version&7.0.47&/version&
&/dependency&
CustomSevlet代码如下
package&org.xdemo.example.TomcatManager.
import&java.io.F
import&java.io.IOE
import&java.io.PrintW
import&javax.management.ObjectN
import&javax.servlet.ServletC
import&javax.servlet.ServletE
import&javax.servlet.UnavailableE
import&javax.servlet.annotation.WebS
import&javax.servlet.http.HttpS
import&javax.servlet.http.HttpServletR
import&javax.servlet.http.HttpServletR
import&org.apache.catalina.C
import&org.apache.catalina.ContainerS
import&org.apache.catalina.C
import&org.apache.catalina.E
import&org.apache.catalina.G
import&org.apache.catalina.H
import&org.apache.catalina.S
import&org.apache.catalina.W
import&org.apache.catalina.manager.C
import&org.apache.catalina.util.ContextN
import&org.apache.tomcat.util.res.StringM
@WebServlet(name=&system&,urlPatterns=&/system/update&)
public&class&CustomServlet&extends&HttpServlet&implements&ContainerServlet{
private&static&final&long&serialVersionUID&=&1102057L;
protected&transient&Host&host&=&
protected&transient&Wrapper&wrapper&=&
protected&transient&Context&context&=&
protected&static&final&StringManager&sm&=&StringManager.getManager(Constants.Package);
protected&int&debug&=&1;
protected&transient&javax.naming.Context&global&=&
protected&File&versioned&=&
protected&File&deployed&=&
protected&File&configBase&=&
protected&ObjectName&oname&=&
// protected&transient&MBeanServer&mBeanServer&=&
&&&&public&void&init()&throws&ServletException&{
&&&&&&&&//&Ensure&that&our&ContainerServlet&properties&have&been&set
&&&&&&&&if&((wrapper&==&null)&||&(context&==&null))
&&&&&&&&&&&&throw&new&UnavailableException(
&&&&&&&&&&&&&&&&&&&&sm.getString(&managerServlet.noWrapper&));
&&&&&&&&//&Set&our&properties&from&the&initialization&parameters
&&&&&&&&String&value&=&
&&&&&&&&try&{
&&&&&&&&&&&&value&=&getServletConfig().getInitParameter(&debug&);
&&&&&&&&&&&&debug&=&Integer.parseInt(value);
&&&&&&&&}&catch&(Throwable&t)&{
&&&&&&&&&&&&//ExceptionUtils.handleThrowable(t);
&&&&&&&&//&Acquire&global&JNDI&resources&if&available
&&&&&&&&Server&server&=&((Engine)host.getParent()).getService().getServer();
&&&&&&&&if&(server&!=&null)&{
&&&&&&&&&&&&global&=&server.getGlobalNamingContext();
&&&&&&&&//&Calculate&the&directory&into&which&we&will&be&deploying&applications
&&&&&&&&versioned&=&(File)&getServletContext().getAttribute
&&&&&&&&&&&&(ServletContext.TEMPDIR);
&&&&&&&&//&Identify&the&appBase&of&the&owning&Host&of&this&Context
&&&&&&&&//&(if&any)
&&&&&&&&String&appBase&=&((Host)&context.getParent()).getAppBase();
&&&&&&&&deployed&=&new&File(appBase);
&&&&&&&&if&(!deployed.isAbsolute())&{
&&&&&&&&&&&&deployed&=&new&File(System.getProperty(Globals.CATALINA_BASE_PROP),
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&appBase);
&&&&&&&&configBase&=&new&File(System.getProperty(Globals.CATALINA_BASE_PROP),&&conf&);
&&&&&&&&Container&container&=&
&&&&&&&&Container&host&=&
&&&&&&&&Container&engine&=&
&&&&&&&&while&(container&!=&null)&{
&&&&&&&&&&&&if&(container&instanceof&Host)
&&&&&&&&&&&&&&&&host&=&
&&&&&&&&&&&&if&(container&instanceof&Engine)
&&&&&&&&&&&&&&&&engine&=&
&&&&&&&&&&&&container&=&container.getParent();
&&&&&&&&if&(engine&!=&null)&{
&&&&&&&&&&&&configBase&=&new&File(configBase,&engine.getName());
&&&&&&&&if&(host&!=&null)&{
&&&&&&&&&&&&configBase&=&new&File(configBase,&host.getName());
&&&&&&&&//&Note:&The&directory&must&exist&for&this&to&work.
&&&&&&&&//&Log&debugging&messages&as&necessary
&&&&&&&&if&(debug&&=&1)&{
&&&&&&&&&&&&log(&init:&Associated&with&Deployer&'&&+
&&&&&&&&&&&&&&&&oname&+&&'&);
&&&&&&&&&&&&if&(global&!=&null)&{
&&&&&&&&&&&&&&&&log(&init:&Global&resources&are&available&);
&&&&&&&&&&&&}
public&Wrapper&getWrapper()&{
//&TODO&Auto-generated&method&stub
return&this.
public&void&setWrapper(Wrapper&wrapper)&{
this.wrapper=
if&(wrapper&==&null)&{
&&&&&&&&&&&&context&=&
&&&&&&&&&&&&host&=&
&&&&&&&&&&&&oname&=&
&&&&&&&&}&else&{
&&&&&&&&&&&&context&=&(Context)&wrapper.getParent();
&&&&&&&&&&&&host&=&(Host)&context.getParent();
&&&&&&&&&&&&Engine&engine&=&(Engine)&host.getParent();
&&&&&&&&&&&&String&name&=&engine.getName()&+&&:type=Deployer,host=&&+
&&&&&&&&&&&&&&&&&&&&host.getName();
&&&&&&&&&&&&try&{
&&&&&&&&&&&&&&&&oname&=&new&ObjectName(name);
&&&&&&&&&&&&}&catch&(Exception&e)&{
&&&&&&&&&&&&&&&&log(sm.getString(&managerServlet.objectNameFail&,&name),&e);
&&&&&&&&&&&&}
protected&void&doGet(HttpServletRequest&request,&HttpServletResponse&response)
throws&ServletException,&IOException&{
ContextName&cn=new&ContextName(&/TomcatManager&,&request.getParameter(&version&));
Context&context&=&(Context)&host.findChild(cn.getName());
context.reload();
在doGet方法中,调用reload方法,指定的项目则会重新加载一遍,效果如下:
这里演示了如何访问Tomcat的API,同样也可以调用API中的其他方法,更多的API信息可以参考
转载请注明来源:
如果文章对您有帮助,欢迎移至上方打赏按钮
width:100%;
bottom: 50
margin: 0;
padding: 0;
text-align:
.ad label,a{
height: 30
display: inline-
line-height: 30
font-weight:
padding-left: 10
padding-right: 10
background: #bd1c7b;
background: #1e5469;
background: #3c7d0c;
background: #a01515;
@keyframes changed {
from {color:background: rgb(214, 9, 9);}
to {color:background:}
animation: changed 0.5s infinite ease-in-animation-direction:
text-decoration:
.entry-content blockquote {
background: rgb(249, 249, 249);
border-left: 4px solid #e5e5e5;
padding: 30px 35px 30px 100
font-style:
color: #404040;
h1,h2,h3,h4,h5,h6{padding:5px!important}2008年10月 Delphi大版内专家分月排行榜第三
2007年7月 PowerBuilder大版内专家分月排行榜第二2006年11月 PowerBuilder大版内专家分月排行榜第二2006年9月 PowerBuilder大版内专家分月排行榜第二2006年7月 PowerBuilder大版内专家分月排行榜第二2005年8月 PowerBuilder大版内专家分月排行榜第二2005年5月 PowerBuilder大版内专家分月排行榜第二2004年10月 PowerBuilder大版内专家分月排行榜第二
2006年2月 PowerBuilder大版内专家分月排行榜第三
2007年7月 PowerBuilder大版内专家分月排行榜第二2006年11月 PowerBuilder大版内专家分月排行榜第二2006年9月 PowerBuilder大版内专家分月排行榜第二2006年7月 PowerBuilder大版内专家分月排行榜第二2005年8月 PowerBuilder大版内专家分月排行榜第二2005年5月 PowerBuilder大版内专家分月排行榜第二2004年10月 PowerBuilder大版内专家分月排行榜第二
2006年2月 PowerBuilder大版内专家分月排行榜第三
2007年7月 PowerBuilder大版内专家分月排行榜第二2006年11月 PowerBuilder大版内专家分月排行榜第二2006年9月 PowerBuilder大版内专家分月排行榜第二2006年7月 PowerBuilder大版内专家分月排行榜第二2005年8月 PowerBuilder大版内专家分月排行榜第二2005年5月 PowerBuilder大版内专家分月排行榜第二2004年10月 PowerBuilder大版内专家分月排行榜第二
2006年2月 PowerBuilder大版内专家分月排行榜第三
2007年7月 PowerBuilder大版内专家分月排行榜第二2006年11月 PowerBuilder大版内专家分月排行榜第二2006年9月 PowerBuilder大版内专家分月排行榜第二2006年7月 PowerBuilder大版内专家分月排行榜第二2005年8月 PowerBuilder大版内专家分月排行榜第二2005年5月 PowerBuilder大版内专家分月排行榜第二2004年10月 PowerBuilder大版内专家分月排行榜第二
2006年2月 PowerBuilder大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。我做了一个定时任务,放在tomcat下,我现在不想让它在启动时执行【java吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:664,792贴子:
我做了一个定时任务,放在tomcat下,我现在不想让它在启动时执行收藏
我现在做了一个定时任务,放在tomcat下,可以正常使用,但是他会在tomecat运行的时候就执行一次。现在我不想让他在启动时执行应该怎么写?
2017java学习来上市公司博为峰学java,入学即签就业协议,不就业不收费,查看java课程!java好学吗?java课程来博为峰学,java工程师就业年薪十几万!
来人啊来人啊来人啊来人啊来人啊来人啊
登录百度帐号推荐应用如何用java程序控制Tomcat重启&-&大和
因为涉及到了用上行控制Tomcat的重启.
所以就想到如何用java代码来控制Tomcat重启了.
因为平时Tomcat在windows上的重启一般都是用vbs或者是
.bat脚本来写的.只要做能做到用JAVA调用这两种
脚本就可以了.
在JAVA的API里面.可以用代码控制本地的可执行文件
而不能直接调用脚本.因此需要把脚本转
换成可执行文件
visualVBS来把vbs脚本转换成.exe
.bat转换的脚本更多.网上搜索一下就能找到了.
之后在线程里面直接调用JAVA API里面的执行代码就可以
做到重启TOMCAT了.
首先是重启脚本,写成.vbs
set WshShell=WScript.CreateObject("WScript.Shell")
WshShell.Run("net stop tomcat5")
WScript.Sleep(10000)
WshShell.Run("net start tomcat5")&
然后用visualVBS转换成.exe文件
然后做一个类,重启Tomcat专用
package com.uf.tool.
public class TomcatReset {
&&& private String tomcat="";
&&& public TomcatReset() {
&&&&&&& Config
config=Config.getConfig();
tomcat=config.getProperties("tomcat");
&&& }
&&& public void tomcatRun(){
&&&&&&& try
&&&&&&&&&&&
System.out.println("the command is:"+tomcat);
&&&&&&&&&&&
Process child = Runtime.getRuntime().exec(tomcat);
&&&&&&& } catch
(Exception e) {
&&&&&&&&&&&
e.printStackTrace();
}&&&&
&&& }
其中tomcat就是其存放的绝对路径,因为可能会变,就写在配置文件里面
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。2014年11月
262728293031125891516202223252930123456
随笔 - 3936
文章 - 404
评论 - 179
留言簿(52)
阅读排行榜
评论排行榜

我要回帖

更多关于 css3实现鼠标悬浮停止 的文章

 

随机推荐