17

我有一堆*.java源文件,其中包含各种包中的类。我正在尝试将所有这些文件导入 Eclipse 项目,但 Eclipse 总是将它们放在默认包中。

如何告诉 Eclipse 将每个文件放在适当的包子目录中,这样我就不必手动创建所有各种包?

我已经尝试过从文件系统功能导入以及将文件复制到项目中,所有这些都会将文件放在default包中,而不是在package每个文件顶部的语句中明确说明的那些。

相关的 SO 问题仅涉及在项目目录层次结构之外引用包src、在合适的包目录中手动创建文件缺少import语句批量重命名包,但似乎还没有讨论过这个问题。

更新:根据评论中的要求,这里有一些示例文件:

测试1.java

package some.random.pkg;

public class Test1 {
}

Test2.java

package some.other.pkg;

public class Test2 {
}

Test3.java

package yet.another.pkg;

public class Test3 {
}

将它们全部放在同一个目录中,然后尝试将它们导入 Eclipse 中的 Java 项目,而无需手动为各种包创建目录。

更新 2:为了澄清规模,假设实际上每周大约有 100 个这样的文件(当然,内容更多;-)),这就是我寻找自动化解决方案的原因。

4

6 回答 6

9

我有点无聊,所以我创建了一个 Java 应用程序来从它的当前工作文件夹中获取所有 .java 文件并将它们放在适当的子文件夹中。

然后,您可以将新创建​​的文件夹/文件复制/粘贴到 Eclipse 中。

源代码和可运行的.jar:https ://github.com/felipeweber/OrganizeJavaSources

要执行它,您需要将可运行的 .jar 复制/粘贴到您拥有所有 .java 文件的文件夹中,然后使用 java -jar OrganizeJavaSources.jar 从提示符或命令行运行它。它应该适用于 Linux 和 Windows(也可能是 MacOS)。

在我的测试中,它与健全的文件完美配合。请注意,我没有做任何错误处理,所以第四,但随时贡献。

祝你好运

于 2013-01-04T18:00:39.063 回答
2

好吧,我们是这里的程序员,对吧?到目前为止,我进行了一项研究,在任何 IDE 中都很难找到这种功能,因为必须警告程序员他将 java 文件放在不正确的包中,并且不能自动为程序员安排它。

好吧,我建议您创建一个简单的 java 控制台程序,它可以为您进行文件操作,我知道这对您来说很容易。这将是程序的可能算法

  1. 读取 .java 文件
  2. 检查该行,直到该.java 文件上package的终止符;
  3. 根据包名称重新定位该文件,.用目录分隔符替换可以用作您将重新定位文件的地址。
  4. 如果文件的重定位文件夹不存在,则创建文件夹
  5. 重复执行此操作,直到重新定位所有文件。

好吧,我不仅希望在 Eclipse 中而且在其他 IDE 上也希望这种功能,我将等待这个问题的进一步答案。

于 2012-12-31T09:59:18.873 回答
2

根据此链接,您可以获得您真正想要做的事情。

文件 -> 新建项目/动态 Web 项目

然后

文件 -> 新建文件夹,单击“高级”并选择“链接到文件系统中的文件夹”。

之后右键单击该文件夹并选择 BuildPath -> 用作源文件夹..就是这样..

或者

您可以创建一个新文件夹,复制包含 *.java 文件的最顶层文件夹并将其粘贴。然后右键单击它,选择 BuildPath -> 用作源文件夹...

我希望这个对你有用!!

于 2012-12-31T11:40:41.893 回答
2

你需要一个黑客。我希望你使用的是 linux,否则会更难:)

1- 创建一个读取和执行 .sh 文件的小 Java 程序 这里的片段显示了如何临时从脚本中读取

 ProcessBuilder pb = new ProcessBuilder("myshell.sh", "myArg1", "myArg2");
 Process p = pb.start();

2-创建.sh脚本并确保java正确选择它(只需在脚本中放置一些回显消息并确保它被打印)

3- 这个 hack 的目标是尝试使用grep读取所有扩展名为 .java 的文件并将其通过管道传送到mv程序,该程序会将它们放入正确的文件夹中。

4-您将了解如何将内容放入哪个文件夹(包)的方式,因为您可以使用cat读取每个文件,并通过这种方式确定它们应该去哪里。mkdir命令应该可以帮助您在移动文件之前正确创建文件夹。

5- 如果您不确定这个解决方案,让我告诉您,这是一项非常复杂的任务,需要您仔细检查并识别所有模式。我相信这是可能的,你可以使用条件管道逻辑和一些令人放松的放松音乐来帮助你集中注意力。

在这里,我给你一些BASH 指南以刷新你的想法

祝你好运,2013新年快乐

于 2013-01-06T23:46:39.860 回答
1

当文件位于错误的包中时,Eclipse 将通过移动文件来让您修复错误。使用“快速修复”功能(在错误视图中选择,按 CTRL+1),您可以轻松移动它们。尝试一次选择它们,也许你的 Eclipse 版本比我的更新,并且可以一次性修复它们。如果没有,它仍然比手动创建包要快。

于 2012-12-31T10:51:47.210 回答
1

所以这就是我所做的......

  1. 新建 -> Java 项目(选项:单击“使用项目文件夹作为源和类文件的根目录”)

  2. 下一个

  3. 选择“链接其他来源”(在详细信息下)

  4. 浏览“链接文件夹位置”并选择顶部文件夹(包含所有包等)

  5. 结束

如果您已经创建了一个项目,那么...

  1. 在包资源管理器中右键单击项目并选择属性

  2. 选择“Java 构建路径”

  3. 选择“链接源”(在“源”选项卡上)

  4. 浏览“链接文件夹位置”并选择顶部文件夹(包含所有包等)

  5. 结束

如果您的文件不在与其中定义的包对应的目录中,请备份您的文件(即将它们全部复制到另一个目录)并尝试以下操作:

使用javac MakePackDirs.java编译以下程序并使用java MakePackDirs运行,将根据包声明创建目录和文件结构,然后使用上述过程。

import java.util.regex.*;
import java.util.*;
import java.io.*;

public class MakePackDirs {

    public static void main(String[] args) throws Exception {

        String pkg;

        for (File f : new File(".").listFiles(
            new FilenameFilter () {
               public boolean accept (File dir, String name) {
                   return name.endsWith(".java");
               } })) {

            if (f.isDirectory()) continue;

            System.out.println("Processing " + f.getName());
            Scanner s = new Scanner(f);
            try {
                Pattern p = Pattern.compile("^[ ]*package +[^;]*", 
                            Pattern.MULTILINE);
                if ((pkg = s.findWithinHorizon(p,0))==null) continue;
            }
            finally {
                s.close();
            }

            System.out.println("Found " + pkg);

            pkg = pkg.split(" ")[1];
            pkg = pkg.replaceAll("\\.","/").trim();

            System.out.println("Creating " + pkg);

            File dir = new File(pkg);
            boolean created = dir.mkdirs();

            if (!created && !dir.exists()) 
                throw new Exception("Can't create package directory");

            // Moving file
            File dest = new File(dir, f.getName());
            boolean renamed = f.renameTo(dest);

            if (!renamed) 
                throw new Exception("Can't move file to " + dest.getPath());

            System.out.println(f.getName() + " moved to " + dir.getPath());
        }
    }
}
于 2013-01-04T17:04:09.613 回答