有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在消息资源文件中查找未使用的值

我正在做一个项目,这个项目是经过多方努力完成的,有时发展很快。随着时间的推移,这条信息逐渐消失。属性文件已与使用它的JSP不同步。现在我不知道使用了哪些属性,哪些没有。是否有一个工具(可能是eclipse插件)可以根除死掉的消息


共 (4) 个答案

  1. # 1 楼答案

    或者,您可以将ResourceBundle的功能隐藏在另一个façade ResourceBundle后面,该façade ResourceBundle通常会将所有调用传递到原始façade,但在顶部添加日志记录和/或统计信息收集

    示例如下所示:

    import java.util.Collection;
    import java.util.Enumeration;
    import java.util.HashSet;
    import java.util.NoSuchElementException;
    import java.util.ResourceBundle;
    
    public class WrapResourceBundle {
    
        static class LoggingResourceBundle extends ResourceBundle {
            private Collection<String> usedKeys = new HashSet<String>();
    
            public LoggingResourceBundle(ResourceBundle parentResourceBundle) {
                setParent(parentResourceBundle);
            }
    
            @Override
            protected Object handleGetObject(String key) {
                Object value = parent.getObject(key);
    
                if (value != null) {
                    usedKeys.add(key);
                    return value;
                }
    
                return null;
            }
    
            @Override
            public Enumeration<String> getKeys() {
                return EMPTY_ENUMERATOR;
            }
    
            public Collection<String> getUsedKeys() {
                return usedKeys;
            }
    
            private static EmptyEnumerator EMPTY_ENUMERATOR = new EmptyEnumerator();
    
            private static class EmptyEnumerator implements Enumeration<String> {
    
                EmptyEnumerator() {
                }
    
                public boolean hasMoreElements() {
                    return false;
                }
    
                public String nextElement() {
                    throw new NoSuchElementException("Empty Enumerator");
                }
            }
        }
    
        public static void main(String[] args) {
            LoggingResourceBundle bundle = new LoggingResourceBundle(ResourceBundle.getBundle("test"));
    
            bundle.getString("key1");
    
            System.out.println("Used keys: " + bundle.getUsedKeys());
        }
    }
    
  2. # 2 楼答案

    我知道至少有两个主要的JavaIDE可以提供这种功能

    • IntelliJ IDEA有一个(默认情况下已禁用)检查,您可以 用于执行此操作:

      转到设置->;检查->;属性文件->。。。并启用 “未使用的财产”

      。。我唯一的问题是,它没有从我编写的自定义标记库中获取属性的一些用法,我在一些JSP中使用了该库

    • Eclipse也有类似的功能(http://help.eclipse.org/helios/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftasks-202.htm),但我还没有完全了解它的工作原理

  3. # 3 楼答案

    问题在于,消息可能由JSP或Java访问,资源名称可能是构造的,而不是文本字符串

    简单的grepping可以识别“明显的”资源访问。另一种解决方案是跟踪所用资源的资源查找机制,它也只是半可靠的,因为代码路径可能决定使用哪些资源,除非每条路径都经过,否则可能会错过一些

    这两者的结合将(随着时间的推移)捕捉到几乎所有的东西

  4. # 4 楼答案

    考虑到您的一些密钥是运行时生成的,我认为您永远无法找到一个工具来验证哪些密钥正在使用,哪些密钥没有使用

    考虑到您提出的问题,我可能会编写一个AOP方面来包装MessageSource。getMessage()实现并记录从资源包中检索的所有请求代码。鉴于MessageSource是一个接口,您需要知道您正在使用的实现,但我怀疑您必须已经知道了

    考虑到您将自己编写方面,您可以创建一种格式,该格式很容易与您的资源包相关联,并且一旦您确信它包含了所需的所有键,那么比较这两个文件并消除任何多余的行就成了一项微不足道的任务

    如果你真的想彻底了解这一点,如果你已经为注释扫描配置了Spring,你甚至可以把你的aspect打包成自己的jar(或.class),放到生产WEB-INF/lib(WEB-INF/classes)文件夹中,重新启动webapp,让它运行一段时间。注释最棒的一点是,它可以是自包含的。一旦确定已经积累了足够的数据,只需删除jar(.class),就可以开始了