2012-04-26 154 views
2

现有的,不兼容的bean定义我得到这个错误后,我混淆我的项目,eventghout只是我的实现类com.company.project.faab由@Component("myImpl")冲突具有相同名称和

合格的java .lang.IllegalStateException:注释指定的bean名称 用于bean类 的'myImpl'[com.company.project.faab]与现有的,不兼容的 相同名称和类的bean定义冲突[com.company.project.faaa ]

我不明白为什么spring会为接口和实现同名。这可能是我的Proguard配置有问题吗?

+2

我不认为Proguard的春季将是兼容的,因为Proguard的重命名类,属性等等... :( – 2012-04-30 12:44:47

+0

我切换到基于注释的配置,这使得proguard可以重命名类的属性等..我只是在与这个障碍挣扎..如果我克服它,它可以definetly工作 – Genjuro 2012-04-30 12:50:48

+0

什么是'com.company.project .faaa'? – 2012-04-30 12:55:37

回答

2

我发现的来源问题,如果启用优化器,Proguard会将交互与其实现合并。

我加入

-dontoptimize 

和probleme解决

3

您可以尝试的是通过告诉proguard通过-keep选项来保留@Componentas is

在情况下,如果你使用proguarg Maven插件,你可以设置这个选项为:

<plugin> 
    ... ... 
    <artifactId>proguard-maven-plugin</artifactId> 
    ... ... 
    <configuration> 
     <obfuscate>true</obfuscate> 
     <options> 
      ... ... 
      <option>-keep @org.springframework.stereotype.Component class *</option> 
      ... ... 
     </options> 
     ... ... 
    </configuration> 
</plugin> 

它会保持@Component部件逆向工程和Spring友好:)

+0

我已经在使用这个选项:-keepattributes * Annotation * 但我会尝试你的建议,但我可以告诉你,proguard不会改变每个类的名字注释“组件”,这是不好的因为它会最终保留整个应用程序:D因为我广泛使用弹簧注入和不同层次 – Genjuro 2012-05-02 08:08:06

+0

因为你是唯一一个发布答案:D我想我'只是为你提供赏金;)我无论如何不能奖励自己:) 谢谢你的伴侣 – Genjuro 2012-05-07 14:18:14

0
for @Component 
<option>-keep @org.springframework.stereotype.Component class *</option> 
for @Controller 
<option>-keep @org.springframework.stereotype.Controller class *</option> 
for @Service 
<option>-keep @org.springframework.stereotype.Service class *</option>