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

时间:2011-11-10 14:15:30

标签: java spring jsp resources

我正在开展一个项目,这个项目已经通过多方面进行,有时甚至是匆忙开发。随着时间的推移,message.properties文件与使用它的jsps不同步。现在我不知道使用了哪些属性,哪些属性没有。是否有可以根除死信息的工具(可能是eclipse插件)?

4 个答案:

答案 0 :(得分:1)

问题是JSP或Java可以访问消息,并且可以构造资源名称而不是文字字符串。

简单grep ping可能能够识别“明显的”资源访问。另一个解决方案,一个跟踪使用内容的资源查找机制,也只是半可靠的,因为代码路径可以确定使用哪些资源,除非每个路径都行走,否则你可能会错过一些。

两者的组合将捕捉大部分内容(随着时间的推移)。

答案 1 :(得分:1)

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

示例如下:

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 :(得分:0)

我知道至少有两个主要的Java IDE可以提供此功能。

  • IntelliJ IDEA有一个(默认情况下禁用)检查 用来做到这一点:

    转到设置 - &gt;检查 - &gt;属性文件 - &gt; ......并启用 '未使用的财产'

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

  • Eclipse也有这样的东西(http://help.eclipse.org/helios/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftasks-202.htm),但我并没有真正用尽它的工作原理。

答案 3 :(得分:0)

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

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

鉴于您将自己编写方面,您可以创建一个易于与资源包相关联的格式,一旦您确信它包含所需的所有密钥,那么比较这两个文件就变得非常简单了。消除任何多余的线条。

如果您真的想彻底了解这一点,如果您已经为注释扫描配置了Spring,您甚至可以将您的方面打包为自己的jar(或.class)并将其放入生产WEB-INF / lib中(WEB-INF / classes)文件夹,重新启动webapp并让它运行一段时间。关于注释的好处是它可以全部是自包含的。一旦你确定你已经积累了足够的数据,你就可以删除jar(.class)并且你很高兴。