使用system.loadLibrary()函数加载库文件后立即删除它是否可行?以下是情况说明:
我们使用JNI调用用C语言编写的DomainSocket实用程序来从Java应用程序中调用。我们将.SO文件打包在同一个JAR文件中,并使用一个实用程序在文件系统上创建一个临时文件并使用loadLibrary函数加载.SO文件。我们使用File.createTempFile()函数创建唯一的临时文件。我们使用deteleOnExit()函数在JVM关闭时删除临时文件。
在独立应用程序的JVM上,这个方案很好用。但是,当部署到Web容器(如Tomcat)时,我们可能会有多个应用程序在同一个JVM上运行的问题。首先,为每个部署的应用程序创建一个临时文件。真正的问题是,当停止和重新启动或重新部署应用程序时,该临时文件不会被删除,而是创建一个新的临时文件。所有的临时文件都在JVM关闭时被删除(Tomcat重启)。
我们试图解决的方法是在loadLibrary()函数之后删除临时文件。这似乎很好用。在重启时创建一个新的临时文件,并在加载后立即删除。
想询问有没有人有一些指针或建议?
我们不想使用common/lib机制仅一次加载.SO文件以使这些.SO文件成为应用程序的一部分。
我们使用JNI调用用C语言编写的DomainSocket实用程序来从Java应用程序中调用。我们将.SO文件打包在同一个JAR文件中,并使用一个实用程序在文件系统上创建一个临时文件并使用loadLibrary函数加载.SO文件。我们使用File.createTempFile()函数创建唯一的临时文件。我们使用deteleOnExit()函数在JVM关闭时删除临时文件。
在独立应用程序的JVM上,这个方案很好用。但是,当部署到Web容器(如Tomcat)时,我们可能会有多个应用程序在同一个JVM上运行的问题。首先,为每个部署的应用程序创建一个临时文件。真正的问题是,当停止和重新启动或重新部署应用程序时,该临时文件不会被删除,而是创建一个新的临时文件。所有的临时文件都在JVM关闭时被删除(Tomcat重启)。
我们试图解决的方法是在loadLibrary()函数之后删除临时文件。这似乎很好用。在重启时创建一个新的临时文件,并在加载后立即删除。
想询问有没有人有一些指针或建议?
我们不想使用common/lib机制仅一次加载.SO文件以使这些.SO文件成为应用程序的一部分。