我创建了一个应用程序,其中基于操作,它修改 jar 内的属性文件。
我可以使用更新的更改创建一个新的临时 jar。但是无法将jar文件重命名为现有的jar文件名。由于它正在运行,我无法删除和重命名它。
任何人都可以提出任何操作或建议来删除 jar(当前正在执行)并将临时 jar 重命名为该名称吗?
我为应用程序做了:http: //java.net/projects_tags/jeazyprops
我创建了一个应用程序,其中基于操作,它修改 jar 内的属性文件。
我可以使用更新的更改创建一个新的临时 jar。但是无法将jar文件重命名为现有的jar文件名。由于它正在运行,我无法删除和重命名它。
任何人都可以提出任何操作或建议来删除 jar(当前正在执行)并将临时 jar 重命名为该名称吗?
我为应用程序做了:http: //java.net/projects_tags/jeazyprops
你的问题是ClassLoader
pre-java 1.7 使用的默认值 - 它锁定它加载的任何 jar 并且在执行完成之前不会释放 jar。最简单的解决方案是使用 Java 1.7,它应该可以解决这个问题。否则,您可以编写自己的自定义ClassLoader
(呃)。默认ClassLoader
:http ://docs.oracle.com/javase/6/docs/api/java/net/URLClassLoader.html
编辑
这是 Oracle 的说明,他们在 Java 1.7 中修复了它:http: //openjdk.java.net/projects/jdk7/features/#f584
可能您需要编写一个自定义类加载器(扩展 ClassLoader),它使您能够加载/卸载 jar。如果您可以卸载 jar,您应该能够删除该 jar。
有用的链接 http://docs.oracle.com/javase/tutorial/deployment/jar/jarclassloader.html
我看不到替换您在程序中执行的 jar 的可能性。
建议的方法。
使用一个简单的类创建一个新 jar,该类仅启动您现有的应用程序。在启动之前,它应该检查是否temp.jar
存在,如果存在则删除原始文件并将其重命名temp.jar
为原始文件。在您的应用程序中创建 后temp.jar
,使用Runtime.exec
并退出启动器类。您的应用程序将使用新 jar 重新启动。