Proguard:AmazonAWS 和 MBean 问题

Proguard: AmazonAWS and MBean issue

我正在尝试使用需要 Amazon AWS 库的 Proguard 缩小 Scala 项目。原始 JAR 文件按预期工作,但缩小的 JAR 文件抛出一个异常,即某些 类 未实现 MBean 约定。在使用“-keep”选项之前,我解决了几个类似的问题,但这次我迷路了。

有什么解决办法吗?

Jul 02, 2016 9:29:38 AM com.amazonaws.jmx.SdkMBeanRegistrySupport registerMetricAdminMBean
WARNING: 
java.lang.IllegalArgumentException: javax.management.NotCompliantMBeanException: MBean class com.amazonaws.metrics.MetricAdmin does not implement DynamicMBean, and neither follows the Standard MBean conventions (javax.management.NotCompliantMBeanException: Class com.amazonaws.metrics.MetricAdmin is not a JMX compliant Standard MBean) nor the MXBean conventions (javax.management.NotCompliantMBeanException: com.amazonaws.metrics.MetricAdmin: Class com.amazonaws.metrics.MetricAdmin is not a JMX compliant MXBean)
    at com.amazonaws.jmx.MBeans.registerMBean(MBeans.java:56)
    at com.amazonaws.jmx.SdkMBeanRegistrySupport.registerMetricAdminMBean(SdkMBeanRegistrySupport.java:27)
    at com.amazonaws.metrics.AwsSdkMetrics.registerMetricAdminMBean(AwsSdkMetrics.java:390)
    at com.amazonaws.metrics.AwsSdkMetrics.<clinit>(AwsSdkMetrics.java:351)
    at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.<clinit>(AmazonDynamoDBClient.java:245)
    at mycode.MinimalTest$.entry(MinimalTest.scala:275)
    at mycode.MinimalTest$.main(MinimalTest.scala:248)
    at mycode.MinimalTest.main(MinimalTest.scala)
Caused by: javax.management.NotCompliantMBeanException: MBean class com.amazonaws.metrics.MetricAdmin does not implement DynamicMBean, and neither follows the Standard MBean conventions (javax.management.NotCompliantMBeanException: Class com.amazonaws.metrics.MetricAdmin is not a JMX compliant Standard MBean) nor the MXBean conventions (javax.management.NotCompliantMBeanException: com.amazonaws.metrics.MetricAdmin: Class com.amazonaws.metrics.MetricAdmin is not a JMX compliant MXBean)
    at com.sun.jmx.mbeanserver.Introspector.checkCompliance(Introspector.java:176)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:317)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522)
    at com.amazonaws.jmx.MBeans.registerMBean(MBeans.java:52)
    ... 7 more

Jul 02, 2016 9:29:38 AM com.amazonaws.jmx.SdkMBeanRegistrySupport registerMetricAdminMBean
WARNING: 
java.lang.IllegalArgumentException: javax.management.NotCompliantMBeanException: MBean class com.amazonaws.metrics.MetricAdmin does not implement DynamicMBean, and neither follows the Standard MBean conventions (javax.management.NotCompliantMBeanException: Class com.amazonaws.metrics.MetricAdmin is not a JMX compliant Standard MBean) nor the MXBean conventions (javax.management.NotCompliantMBeanException: com.amazonaws.metrics.MetricAdmin: Class com.amazonaws.metrics.MetricAdmin is not a JMX compliant MXBean)
    at com.amazonaws.jmx.MBeans.registerMBean(MBeans.java:56)
    at com.amazonaws.jmx.SdkMBeanRegistrySupport.registerMetricAdminMBean(SdkMBeanRegistrySupport.java:27)
    at com.amazonaws.metrics.AwsSdkMetrics.registerMetricAdminMBean(AwsSdkMetrics.java:399)
    at com.amazonaws.metrics.AwsSdkMetrics.<clinit>(AwsSdkMetrics.java:351)
    at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient.<clinit>(AmazonDynamoDBClient.java:245)
    at mycode.MinimalTest$.entry(MinimalTest.scala:275)
    at mycode.MinimalTest$.main(MinimalTest.scala:248)
    at mycode.MinimalTest.main(MinimalTest.scala)
Caused by: javax.management.NotCompliantMBeanException: MBean class com.amazonaws.metrics.MetricAdmin does not implement DynamicMBean, and neither follows the Standard MBean conventions (javax.management.NotCompliantMBeanException: Class com.amazonaws.metrics.MetricAdmin is not a JMX compliant Standard MBean) nor the MXBean conventions (javax.management.NotCompliantMBeanException: com.amazonaws.metrics.MetricAdmin: Class com.amazonaws.metrics.MetricAdmin is not a JMX compliant MXBean)
    at com.sun.jmx.mbeanserver.Introspector.checkCompliance(Introspector.java:176)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:317)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522)
    at com.amazonaws.jmx.MBeans.registerMBean(MBeans.java:52)
    ... 7 more

Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.fasterxml.jackson.databind.ObjectMapper.<init>(ObjectMapper.java:531)
    at com.fasterxml.jackson.databind.ObjectMapper.<init>(ObjectMapper.java:448)
    at com.amazonaws.internal.config.InternalConfig.<clinit>(InternalConfig.java:43)
    at com.amazonaws.internal.config.InternalConfig$Factory.<clinit>(InternalConfig.java:304)
    at com.amazonaws.util.VersionInfoUtils.userAgent(VersionInfoUtils.java:141)
    at com.amazonaws.util.VersionInfoUtils.initializeUserAgent(VersionInfoUtils.java:136)
    at com.amazonaws.util.VersionInfoUtils.getUserAgent(VersionInfoUtils.java:97)
    at com.amazonaws.ClientConfiguration.<clinit>(ClientConfiguration.java:60)
    at com.amazonaws.ClientConfigurationFactory.getDefaultConfig(ClientConfigurationFactory.java:46)
    at com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientConfigurationFactory.getDefaultConfig(AmazonDynamoDBClientConfigurationFactory.java:31)
    at com.amazonaws.ClientConfigurationFactory.getConfig(ClientConfigurationFactory.java:36)
    at com.amazonaws.services.dynamodbv2.AmazonDynamoDBAsyncClient.<init>(AmazonDynamoDBAsyncClient.java:319)
    at com.amazonaws.services.dynamodbv2.AmazonDynamoDBAsyncClient.<init>(AmazonDynamoDBAsyncClient.java:299)
    at mycode.MinimalTest$.entry(MinimalTest.scala:275)
    at mycode.MinimalTest$.main(MinimalTest.scala:248)
    at mycode.MinimalTest.main(MinimalTest.scala)
Caused by: java.lang.NullPointerException
    at com.fasterxml.jackson.databind.cfg.MapperConfig.collectFeatureDefaults(MapperConfig.java:88)
    at com.fasterxml.jackson.databind.cfg.MapperConfigBase.<clinit>(MapperConfigBase.java:31)
    ... 16 more

您必须指示 ProGuard 保持 MBean 类 非混淆以遵循标准 MBean 约定。像这样的规则可能就足够了:

-keep class **MBean {
    void set*(***);
    void set*(int, ***);

    boolean is*(); 
    boolean is*(int);

    *** get*();
    *** get*(int);
}

这将指示 ProGuard 保留所有 类 名称如 *MBean 的所有 类 并保留任何 getters/setters.