I need to get a list of deployed webapps in Apache Tomcat. Also, for each webapp I need to get a list of initialized servlets and JSPs. Any ideas how this can be done?
I don't know how to do it. But there is a manager application in the standard distribution of tomcat, which lists the deployed apps. Sourcecode is provided, so you could have a look there.
Regarding your question about other webapps: Yes, there could be other webapps, which resides not in the webapp directory. They could be specified in the server.xml.
Check out the Apache Tomcat manual. Section 5 is about the Manager application in Tomcat, which does just that.
The best way I found for information about the deployed applications and their content (including servlets, files, connections and such) is to install Lambda Probe in addition to whatever the tomcat instance is serving.
In order to get a list of deployed apps of your tomcat you just need configure user/roles and use /manager/text/list tomcat endpoint
Add this in your /.../.../TOMCAT_HOME/conf/tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="my_user" password="my_pass" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>
You could skip "admin-gui" & "admin-script" roles if you will not perform admin operations.
After that, restart tomcat
Go to your favorite browser and enter this url:
http://some_ip:some_port/manager/text/list
A login will appear. Enter the user/password configured in your TOMCAT_HOME/conf/tomcat-users.xml
Just execute this:
curl -v -u my_user:my_pass http://127.0.0.1:some_port/manager/text/list
The result should be:
OK - Listed applications for virtual host localhost
/manager:running:0:manager
/:running:0:ROOT
/docs:running:0:docs
/examples:running:0:examples
/host-manager:running:0:host-manager
/my_app:running:0:my_app
/my_other_app:running:0:my_other_app
....
* Connection #0 to host 127.0.0.1 left intact
List apps with curl is used by a plugins related to automated tomcat deploys (Devops)
HTH
You can do it by using javax.management. It will look like
private Iterable<String> collectAllDeployedApps() {
try {
final Set<String> result = new HashSet<>();
final Set<ObjectName> instances = findServer()
.queryNames(new ObjectName("Tomcat:j2eeType=WebModule,*"), null);
for (ObjectName each : instances) {
result.add(substringAfterLast(each.getKeyProperty("name"), "/")); //it will be in format like //localhost/appname
}
return result;
} catch (MalformedObjectNameException e) {
//handle
}
}
private MBeanServer findServer() {
ArrayList<MBeanServer> servers = MBeanServerFactory.findMBeanServer(null);
for (MBeanServer eachServer : servers) {
for (String domain : eachServer.getDomains()) {
if (domain.equals("Tomcat")) {
return eachServer;
}
}
}
//handle. We are not in Tomcat.
}
http://code.google.com/p/psi-probe/wiki/Features seems like a good place to look.