3

我不确定这是否可能,但我有一个旧的 Java 应用程序项目,其中有 1000 多个 Java 文件。我正在尝试向需要我添加的应用程序添加 log4j 支持

public static Logger logger = Logger.getLogger(MyClass.class.getName());

在每个文件中。

有什么方法可以使用 eclipse 执行操作。我已经尝试过source->format,但这不允许我添加该行。我是否必须打开每个文件并添加该行?

4

6 回答 6

6

您可以在 eclipse 中使用模板,但在这种情况下,您需要编辑每个文件并添加它。

更新 :

将以下内容保存在一些扩展名为“.xml”的文件中

<?xml version="1.0" encoding="UTF-8" standalone="no"?><templates><template autoinsert="true" context="java-members" deleted="false" description="adds the logger statement" enabled="true" name="logger">public static Logger logger = Logger.getLogger(${enclosing_type}.class.getName());</template></templates>

按 CTRL+3,键入 - “模板”,然后选择 Templates - Java Editor,如下所示

在此处输入图像描述

从右侧菜单导入文件,如下所示

在此处输入图像描述

现在转到您的任何文件并在您的类文件中键入“logger”并执行 CTRL+space ,快速帮助将向您显示“logger”模板,如下所示

在此处输入图像描述 并且您的日志记录语句将出现,您正在编辑的类如下所示

在此处输入图像描述

于 2013-04-11T17:01:12.773 回答
2

您可以以编程方式进行。从所有 .java 的过滤器开始:

public class FileExtensionFilter implements FilenameFilter {
    private Set<String> filteredExtensions;
    public FileExtensionFilter() {
        filteredExtensions = new HashSet<String>();
    }
    @Override
    public boolean accept(File dir, String name) {
        boolean accept = true;
        for (String filteredExtension:filteredExtensions) {
            accept = accept && !name.endsWith(filteredExtension);
        }
        return accept;
    }
    public void addFilteredExtension(String extension) {
        filteredExtensions.add(extension);
    }
}

然后您可以使用递归方法查找文件:

public Set<String> searchFileBasedOnExtension(File file) {
    Set<String> extensions = new HashSet<String>();
    if (file.isDirectory()) {
        for (File f : file.listFiles(fileExtensionFilter)) {
            extensions.addAll(checkForExtensions(f));
        }
    } else {
        String extension = file.getName().substring(Math.max(file.getName().lastIndexOf('.'),0));
        extensions.add(extension);
        fileExtensionFilter.addFilteredExtension(extension);
    }
    return extensions;
}

然后根据你收到的集合,你可以迭代它,读取文件找到添加“导入”的位置,也找到类名,并将其保存到变量中以替换每个文件,因为每个文件代表一个不同的班级。

样本:

for (String s : setWithFileNames) {
 // Use BufferedReader to read the file, save the content in a String, then look inside the String the classname and the first import position.
 // Use bufferedWriter to re-write the file with the changes you made.
}

希望它可以帮助您满足您的要求。此致。

于 2013-04-11T17:15:27.907 回答
1

打开每个文件并添加这一行将是乏味的。

我不确定 Eclipse 是否有这样的东西。

但我建议使用 shell 脚本或 Java 函数来执行此操作。

  1. 阅读每个文件。
  2. 搜索第一个“{”字符。
  3. 在旁边的行中插入 logger 语句。
  4. 您可以从文件名中获取类名。

我知道这可能不是您的最佳解决方案。

希望这可以帮助。

于 2013-04-11T17:03:37.627 回答
1

如果你有记事本++,你可以做到。使用正则表达式对目录使用查找替换功能。

因此,以 开头的行public class需要替换为该行,另一行以 log 语句替换。

于 2013-04-11T17:08:30.523 回答
1

另一个建议是使用 AspectJ。AspectJ 是对 Java 的扩展,它允许您系统地将额外的功能编织到现有的类中。您首先需要安装 AJDT(AspectJ 开发工具)。然后你需要像这样创建一个方面:

aspect LoggingAspect {
  before (Object thiz) : execution(public * *(..)) && this(thiz) {
    Logger logger = Logger.getLogger(thiz.getClass().getName());
    logger.log("Something");
  }
}

上述方面将记录您编译的类之一的公共方法的每次执行。您当然可以通过多种方式对此进行调整。记录是 AspectJ 可以做的最简单的事情之一。沿着这条路走下去的好处是,您可以通过注释掉 4 行来轻松地启用/禁用项目的日志记录。

AspectJ的主要网站。AspectJ 编程指南是开始使用 AspectJ 的好地方。

于 2013-04-11T17:40:17.663 回答
0

您可以运行以下命令在特定行号上添加任何行,只需提供文件夹名称,它将搜索文件扩展名为 .java 的所有子文件夹并在特定位置添加行:

find <Folder Path> -name "*.java" -exec sed -i '1i<Text: You want to add>' {} \;
于 2016-11-02T16:28:57.233 回答