有没有办法让netbeans在编译时自动重启tomcat?

时间:2018-01-23 22:10:46

标签: java tomcat netbeans compilation restart

我正在使用一个使用Sigar库的Spring MVC项目,该库依赖于Tomcat加载的DLL文件。当我第一次启动netbeans并按下播放时(当服务器停止时),它编译得很好,并且站点与库完全交互。如果我在没有首先重启Tomcat的情况下关闭网页并再次点击播放,它会尝试再次加载库并在部署期间崩溃。看起来Tomcat尝试第二次加载Sigar DLL并在部署时崩溃(因为我有一个Sigar实例作为Spring控制器中的全局变量。有没有办法让netbeans在按下播放时自动重启Tomcat?

修改

好的,所以我试图解决这个问题,让Tomcat只加载DLL,如果它尚未加载。我搜索了一下,发现像你这样的类应该在你正在编译的web应用程序之前运行:

@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类,就像我发现的帖子中提供的一样,它确实返回了一个String列表,其中包含Sigar DLL的路径,当我将它放入Tomcat的bin文件夹中以便加载它时。但是,当我在这个类中放置一个断点时,它永远不会到达,并且我的Web应用程序无法部署,因为控制器依赖于它无法初始化。我做错了什么?

BIG UPDATE

我能够通过添加将DLL文件放到PATH环境变量中的路径来动态加载库并执行:

System.loadLibrary("sigar-amd64-winnt");

问题是,只有当我的Sigar实例不是控制器的全局实例并且我需要它时,它才有效。看起来tomcat在使用WebListener运行注释的类之前实例化servlet。是否有任何方法可以在加载servlet之前将库加载到Tomcat中,而不是将其放入Tomcat的bin文件夹中,这使我不得不在编译应用程序之前不断重新启动它?

谢谢!

2 个答案:

答案 0 :(得分:0)

如果您正在使用maven或类似的东西来部署您的系统,您可以使用自定义阶段,每次部署代码时停止并重新启动tomcat服务器。

您的系统崩溃是正常的,因为当您再次点击播放按钮时,您尝试在同一端口(通常是8080)上重新启动具有相同参数的tomcat服务器。如果您没有停止服务器,可能是手动或可能使用maven自定义阶段,您将收到错误,而不是部署您需要的DLL,而是部署tomcat服务器本身,因为netbeans继续运行服务器,如果你不停止它。 如果您再次尝试打开标签页,则会看到它仍然已部署。

在其他IDE中,如IntelliJ,有一个特殊按钮,允许您从一个按钮停止并重新运行您的项目,但在我看来,我认为maven选项更好,因为它允许您很好地处理java依赖项。

希望它有所帮助,至少有一点。

答案 1 :(得分:0)

好吧,我发现了一个有效的廉价黑客。我在控制器中全局声明了我的Sigar实例,但我只在加载页面时初始化它。这解决了我的所有问题,但我仍然想知道是否有办法在Spring实例化控制器之前运行代码。谢谢!