【发布时间】:2018-01-23 22:10:45
【问题描述】:
我正在开发一个使用 Sigar 库的 Spring MVC 项目,该库依赖于 Tomcat 加载的 DLL 文件。当我第一次启动 netbeans 并按下播放(当服务器停止时)它编译得很好并且站点与库完美交互。如果我在没有先重新启动 Tomcat 的情况下关闭网页并再次点击播放,它会尝试再次加载库并在部署期间崩溃。看起来 Tomcat 尝试第二次加载 Sigar DLL 并在部署时崩溃(因为我在 Spring 控制器中有一个 Sigar 实例作为全局变量。有没有办法让 netbeans 在按下播放时自动重启 Tomcat?
编辑
好的,所以我试图通过让 Tomcat 仅加载尚未加载的 DLL 来解决此问题。我搜索了一下,发现像这样的类应该在您正在编译的网络应用程序运行之前运行:
@WebListener
public class MDHISServletContextListener implements ServletContextListener
{
@Override
public void contextInitialized(ServletContextEvent arg0)
{
loadNativeLibraries();
}
private void loadNativeLibraries()
{
boolean sigarLoaded = false;
try
{
List<String> nativeLibraries = new NativeLibraryBrowser().getLoadedLibraries();
for (String library : nativeLibraries)
{
if (library.contains("sigar"))
{
sigarLoaded = true;
break;
}
}
if (!sigarLoaded)
{
System.loadLibrary("C:\\path\\to\\dll\\folder\\sigar-amd64-winnt.dll");
}
}
catch (Exception ex)
{}
}
}
我已经构建了 NativeLibraryBrowser 类,就像我发现的一篇文章中提供的那样,当我将它放在 Tomcat 的 bin 文件夹中以供加载时,它确实返回了一个包含 Sigar DLL 路径的字符串列表。但是,当我在此类中放置断点时,它永远不会到达,并且由于控制器依赖于它无法初始化,我的 Web 应用程序无法部署。我做错了什么?
重大更新
我能够通过将我放置 DLL 文件的路径添加到 PATH 环境变量并执行以下操作来动态加载库:
System.loadLibrary("sigar-amd64-winnt");
问题是它仅在我的 Sigar 实例对控制器不是全局的并且我需要它时才有效。看起来 tomcat 在使用 WebListener 注释的类运行之前实例化了 servlet。有什么方法可以在加载 servlet 之前将库加载到 Tomcat 中,除了将它放到 Tomcat 的 bin 文件夹中,这让我不得不在编译我的应用程序之前不断地重新启动它?
谢谢!
【问题讨论】:
-
在输出窗口,tomcat输出选项卡(不是tomcat日志)有一个“快进”按钮,总是重启服务器。如果这还不够,您可能会在 build-impl.xml 中获得所需的自定义 ant run 任务。
-
我没有看到这个按钮,谢谢,这肯定有用。
标签: java tomcat netbeans compilation restart