我不确定这是否是合适的位置,但我有一个Java问题。我有一些Java代码可以在Java 6中工作,但在Java 7中不能工作,错误是:
java.lang.IllegalStateException: This function should be called while holding treeLock使用Java6可以工作,但我们的一些外部用户运行的是Java7。我发现错误是由调用validateTree()引起的,它在java6中工作,但在Java7中我们需要调用validate()。当我在本地测试它时,它是有效的。
这就是我的问题,我开始在一家大公司工作,他们不允许我们对代码做任何更改,直到它被非常彻底地研究(我的工作更改将在2013年4月生效),但在此之前,我们的用户会感到恼火。我不是最擅长Java的人,我想知道是否有一种方法可以传递运行时参数来改变这一点?或者,有什么我可以做的而不涉及代码库吗?
我很抱歉问这个问题,因为它可以很容易地解决,只需实现修复,但任何想法或方向都会非常有帮助。
更新:理想情况下,我正在寻找一些可以在java运行时参数中添加支持的东西,它可以将所有validateTree()引用更改为validate()。
发布于 2012-10-10 22:16:42
我可以使用运行时参数来修复
中糟糕的API调用吗?
一般来说,不是。
在特定情况下,您可以查看类库的Java 7版本的相关类的源代码,以查看是否存在向后兼容性属性。
假设你找不到解决方法,你就有点卡住了。我建议:
如果这些都不起作用,那么真正的问题是你的客户和你的管理层之间的问题。你已经做了你能做的一切。让“上级”来处理吧。
您可能会对my Answer to a related SO Question感兴趣,它涉及到他们为什么做出这种“破坏性”更改的问题。我的观点是,这种改变是为了迫使人们修复一类隐蔽的、难以重现的应用程序错误,这些错误会导致奇怪的UI行为。这是件好事..。从长远来看。
在此基础上,您可以提出更有力的理由来发布带外修复。用validate()调用替换validateTree()调用的补丁实际上是所有Java平台的必要补丁,而不仅仅是Java7。
发布于 2012-10-10 22:16:53
我有一些Java代码可以在Java6中工作,但在Java7中不能工作。
一种“变通办法”(我可以看到这是不受欢迎的)是:
使用JNLP部署小程序,并使用1.6*的J2SE version attribute。详情请参见Java Web Start - Runtime Versioning。
注意,它只能嵌入到Plug-in2JRE( 1.6 JRE的子集)中工作&即使这样,客户端也很可能会收到关于“使用早期JRE”的警告。如果小程序可以使用JWS自由浮动启动,它将(假设)在1.4.2+周围工作。
修复方法是更改applet代码,使其与两个JRE兼容,如kleopatra的第二个注释& Stephen C的答案所述。
https://stackoverflow.com/questions/12821047
复制相似问题