【问题标题】:conflicts with existing, non-compatible bean definition of same name and class与相同名称和类的现有不兼容 bean 定义冲突
【发布时间】:2012-04-26 17:25:54
【问题描述】:

我在混淆我的项目后收到此错误,eventghout 只有我的实现类 com.company.project.f.a.a.b 符合 @Component("myImpl")

java.lang.IllegalStateException: Annotation-specified bean name 'myImpl' 用于 bean 类 [com.company.project.f.a.a.b] 与现有的不兼容的冲突 同名同类的bean定义[com.company.project.f.a.a.a]

我真的不明白为什么 spring 为 interface 和 implementation 赋予了相同的名称。我的 Proguard 配置有问题吗?

【问题讨论】:

  • 我不认为 Proguard 和 Spring 会兼容,因为 Proguard 重命名类、属性等... :(
  • 我切换到基于注释的配置,这使得 proguard 可以重命名类属性等.. 我只是在与这些障碍作斗争.. 如果我克服了它,它肯定可以工作。
  • com.company.project.f.a.a.a 是什么?
  • com.company.project.f.a.a.a是com.company.project.f.a.a.b中实现的接口
  • 你确定你的类路径中没有旧 jar 吗?

标签: spring proguard


【解决方案1】:

您可以尝试通过 -keep 选项告诉 proguard 保留 @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 友好:)

【讨论】:

  • 我已经在使用这个选项:-keepattributes Annotation 但我会尝试你的建议,但我可以告诉 proguard 不会更改使用的每个类的名称注释“组件”,这不好,因为它最终会保留整个应用程序:D,因为我广泛使用弹簧注射和不同的层。
  • 因为你是唯一一个发布答案的人 :D 我想我只会给你赏金;) 我不能奖励自己:) 谢谢队友
【解决方案2】:

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

我加了

-dontoptimize

问题解决了

【讨论】:

  • Proguard 还可以将现有的类重命名为相同的名称,比如说'a'。如果有 2 个具有 @Component 的类,并且如果两者都用 'a' 重命名为混淆的一部分,那么它将在启动期间导致重复 bean 问题。为了解决这个问题,我使用了 -keepnames class package1 -keepnames class package2。还有比这更好的解决方案吗?
【解决方案3】:
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> 

【讨论】:

    【解决方案4】:

    如果您移动了类并且它引用旧类,即使它们不存在,有时也会出现问题。

    在这种情况下,只需这样做:

    mvn eclipse:clean
    
    mvn eclipse:eclipse
    

    这对我很有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 2013-08-08
      • 2021-09-01
      • 1970-01-01
      相关资源
      最近更新 更多