我有一堆顶级的包属于同一个团队。所有顶级包都使用spring。还有一些库(jars),它们是顶级包之间共享的功能和实用程序。都是很标准的东西。
在某些情况下,在库包中使用spring是有意义的。假设我有一系列共享的方面,并且我想使用spring的@方面/@Before/@After等注释。
问题是,有相当大的顶层包是用Spring2.5.6依赖编写的,而较新的顶层包是在spring 3中创建的,我通常认为这是一件好事。
但还有一个小问题,我现在有一些依赖于spring-2.5.6的库,而这些库不能被spring-3顶层包使用,因为版本不匹配(我在这里假设吸纳两个不同的spring版本是一个非常糟糕的主意)。似乎我的选择是避免在库中依赖spring,或者接受我的库将需要提供多个版本(在顶级包级别使用的每个spring版本一个)。选项1似乎比选项2更可取,但我希望有一些有趣的技巧,让我两全其美。
如果其中一些东西有java标准(@Inject?)这样我就可以依赖于javax的东西,而不是spring特有的东西。不幸的是,@Inject等只支持spring 3+,所以可以在将来的某个时候修复我的问题,但只要我有2.5.6的应用程序,它就没有帮助。
想法?
我应该注意到,有一些现有的库依赖于spring-2.5.6,我认为这是将顶级包升级到spring-3的一种威慑。因为升级顶级包也意味着升级依赖于spring的N个库的版本,这很烦人,因为我甚至不知道这些库的完整用户集,以及他们可能会如何看待spring版本突然被颠覆。
编辑:
我想知道我是否可以创建一些库,并使用提供的作用域创建一个spring依赖。spring版本将是我可以选择的最低版本,以获得我想要的功能集,所以理想情况下,我会使用2.5.6来使其与Spring2.5.6应用程序和spring-3.0.5应用程序兼容。然后,当消费应用程序在我的库上创建依赖项时,它也会为该应用程序有效的实际spring版本创建一个spring依赖项。我认为这应该可以工作,只要spring版本是我为我的库选择的>=版本(我碰巧知道2.5.6是所有应用程序使用的最低版本)。
我的另一个选择是根本不创建spring依赖项,但提供一个可以在调用应用程序中导入的spring.xml。这意味着我不能使用注解或者像InitializingBean这样的东西,但是通常spring已经提供了一种通过注解或者xml,或者两者都提供的方法,所以这也应该可以工作。
有什么想法?
发布于 2011-05-28 01:03:36
正如您正确地提到的,同时拥有2.5.6和3.0的Spring依赖项将会产生问题。在运行时只会选择一个版本,这意味着要么您的顶级封装模块将失败,要么其他共享实用程序将失败(取决于Spring的版本)。
在Java Classloader - how to reference different versions of a jar中也讨论了类似的问题。它与Spring没有直接的关系,但是我想不出一个直接的解决方案来解决你的问题。OSGi是一种可能的解决方案,但不确定它在您的环境中是否可行,因为它需要更改容器本身。
发布于 2011-05-27 22:53:54
a) @Aspect @Before @After:这些注解都是用aspectjrt.jar编写的,而不是Spring本身。它们应该可以与任一版本一起工作
b) @Inject不会工作,但@Autowired会。
https://stackoverflow.com/questions/6153934
复制相似问题