📄 hostconfig.java
字号:
log.debug(sm.getString("hostConfig.deployDir", files[i]));
long t1=System.currentTimeMillis();
try {
URL url = new URL("file", null, dir.getCanonicalPath());
((Deployer) host).install(contextPath, url);
} catch (Throwable t) {
log.error(sm.getString("hostConfig.deployDir.error", files[i]),
t);
}
long t2=System.currentTimeMillis();
if( (t2-t1) > 200 )
log.debug("Deployed " + files[i] + " " + (t2-t1));
}
}
}
/**
* Check deployment descriptors last modified date.
*/
protected void checkContextLastModified() {
if (!(host instanceof Deployer))
return;
Deployer deployer = (Deployer) host;
String[] contextNames = deployer.findDeployedApps();
for (int i = 0; i < contextNames.length; i++) {
String contextName = contextNames[i];
Context context = deployer.findDeployedApp(contextName);
if (!(context instanceof Lifecycle))
continue;
try {
DirContext resources = context.getResources();
if (resources == null) {
// This can happen if there was an error initializing
// the context
continue;
}
ResourceAttributes webXmlAttributes =
(ResourceAttributes)
resources.getAttributes("/WEB-INF/web.xml");
ResourceAttributes webInfAttributes =
(ResourceAttributes)
resources.getAttributes("/WEB-INF");
long newLastModified = webXmlAttributes.getLastModified();
long webInfLastModified = webInfAttributes.getLastModified();
Long lastModified = (Long) webXmlLastModified.get(contextName);
if (lastModified == null) {
webXmlLastModified.put
(contextName, new Long(newLastModified));
} else {
if (lastModified.longValue() != newLastModified) {
if (newLastModified > (webInfLastModified + 5000)) {
webXmlLastModified.remove(contextName);
restartContext(context);
} else {
webXmlLastModified.put
(contextName, new Long(newLastModified));
}
}
}
} catch (NamingException e) {
; // Ignore
}
Long lastModified = (Long) contextXmlLastModified.get(contextName);
String configBase = configBase().getPath();
String configFileName = context.getConfigFile();
if (configFileName != null) {
File configFile = new File(configFileName);
if (!configFile.isAbsolute()) {
configFile = new File(System.getProperty("catalina.base"),
configFile.getPath());
}
long newLastModified = configFile.lastModified();
if (lastModified == null) {
contextXmlLastModified.put
(contextName, new Long(newLastModified));
} else {
if (lastModified.longValue() != newLastModified) {
contextXmlLastModified.remove(contextName);
String fileName = configFileName;
if (fileName.startsWith(configBase)) {
fileName =
fileName.substring(configBase.length() + 1);
try {
deployed.remove(fileName);
if (host.findChild(contextName) != null) {
((Deployer) host).remove(contextName);
}
} catch (Throwable t) {
log.error(sm.getString
("hostConfig.undeployJar.error",
fileName), t);
}
deployApps();
}
}
}
}
}
// Check for WAR modification
if (isUnpackWARs()) {
File appBase = appBase();
if (!appBase.exists() || !appBase.isDirectory())
return;
String files[] = appBase.list();
for (int i = 0; i < files.length; i++) {
if (files[i].endsWith(".war")) {
File dir = new File(appBase, files[i]);
Long lastModified = (Long) warLastModified.get(files[i]);
long dirLastModified = dir.lastModified();
if (lastModified == null) {
warLastModified.put
(files[i], new Long(dir.lastModified()));
} else if (dirLastModified > lastModified.longValue()) {
// The WAR has been modified: redeploy
String expandedDir = files[i];
int period = expandedDir.lastIndexOf(".");
if (period >= 0)
expandedDir = expandedDir.substring(0, period);
File expanded = new File(appBase, expandedDir);
String contextPath = "/" + expandedDir;
if (contextPath.equals("/ROOT"))
contextPath = "";
if (dirLastModified > expanded.lastModified()) {
try {
// Undeploy current application
deployed.remove(files[i]);
deployed.remove(expandedDir + ".xml");
if (host.findChild(contextPath) != null) {
((Deployer) host).remove(contextPath,
false);
ExpandWar.deleteDir(expanded);
}
} catch (Throwable t) {
log.error(sm.getString
("hostConfig.undeployJar.error",
files[i]), t);
}
deployApps();
}
// If deployment was successful, reset
// the last modified values
if (host.findChild(contextPath) != null) {
webXmlLastModified.remove(contextPath);
warLastModified.put
(files[i], new Long(dir.lastModified()));
}
}
}
}
}
}
protected boolean restartContext(Context context) {
boolean result = true;
log.info("restartContext(" + context.getName() + ")");
if (context instanceof StandardContext) {
try {
StandardContext sctx = (StandardContext)context;
sctx.reload();
} catch (Exception e) {
log.warn(sm.getString
("hostConfig.context.restart", context.getName()), e);
result = false;
}
} else {
try {
((Lifecycle) context).stop();
} catch (Exception e) {
log.warn(sm.getString
("hostConfig.context.restart", context.getName()), e);
}
// If the context was not started (for example an error
// in web.xml) we'll still get to try to start
try {
((Lifecycle) context).start();
} catch (Exception e) {
log.warn(sm.getString
("hostConfig.context.restart", context.getName()), e);
result = false;
}
}
return result;
}
/**
* Expand the WAR file found at the specified URL into an unpacked
* directory structure, and return the absolute pathname to the expanded
* directory.
*
* @param war URL of the web application archive to be expanded
* (must start with "jar:")
*
* @exception IllegalArgumentException if this is not a "jar:" URL
* @exception IOException if an input/output error was encountered
* during expansion
*/
protected String expand(URL war) throws IOException {
return ExpandWar.expand(host,war);
}
/**
* Expand the specified input stream into the specified directory, creating
* a file named from the specified relative path.
*
* @param input InputStream to be copied
* @param docBase Document base directory into which we are expanding
* @param name Relative pathname of the file to be created
*
* @exception IOException if an input/output error occurs
*/
protected void expand(InputStream input, File docBase, String name)
throws IOException {
ExpandWar.expand(input,docBase,name);
}
/**
* Log a message on the Logger associated with our Host (if any)
*
* @param message Message to be logged
*/
protected void log(String message) {
Logger logger = null;
if (host != null)
logger = host.getLogger();
if (logger != null)
logger.log("HostConfig[" + host.getName() + "]: " + message);
else
log.info(message);
}
/**
* Log a message on the Logger associated with our Host (if any)
*
* @param message Message to be logged
* @param throwable Associated exception
*/
protected void log(String message, Throwable throwable) {
Logger logger = null;
if (host != null)
logger = host.getLogger();
if (logger != null)
logger.log("HostConfig[" + host.getName() + "] "
+ message, throwable);
else {
log.error( message, throwable );
}
}
/**
* Process a "start" event for this Host.
*/
public void start() {
if (log.isDebugEnabled())
log.debug(sm.getString("hostConfig.start"));
if (host.getDeployOnStartup()) {
deployApps();
} else {
// Deploy descriptors anyway (it should be equivalent to being
// part of server.xml)
File configBase = configBase();
if (configBase.exists() && configBase.isDirectory()) {
String configFiles[] = configBase.list();
deployDescriptors(configBase, configFiles);
}
}
}
/**
* Process a "stop" event for this Host.
*/
public void stop() {
if (log.isDebugEnabled())
log.debug(sm.getString("hostConfig.stop"));
undeployApps();
appBase = null;
configBase = null;
}
/**
* Undeploy all deployed applications.
*/
protected void undeployApps() {
if (!(host instanceof Deployer))
return;
if (log.isDebugEnabled())
log.debug(sm.getString("hostConfig.undeploying"));
String contextPaths[] = ((Deployer) host).findDeployedApps();
for (int i = 0; i < contextPaths.length; i++) {
if (log.isDebugEnabled())
log.debug(sm.getString("hostConfig.undeploy", contextPaths[i]));
try {
((Deployer) host).remove(contextPaths[i]);
} catch (Throwable t) {
log.error(sm.getString("hostConfig.undeploy.error",
contextPaths[i]), t);
}
}
webXmlLastModified.clear();
deployed.clear();
}
/**
* Deploy webapps.
*/
protected void check() {
if (host.getAutoDeploy()) {
// Deploy apps if the Host allows auto deploying
deployApps();
// Check for web.xml modification
checkContextLastModified();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -