将 .java 文件导入正确的包中

Posted

技术标签:

【中文标题】将 .java 文件导入正确的包中【英文标题】:Import .java Files Into the Correct Package 【发布时间】:2012-12-06 20:45:48 【问题描述】:

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

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

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

相关的 SO 问题仅涉及 referencing packages outside of the project's src directory hierarchy、manually creating files in the suitable package directory、missing import statements 或 bulk-renaming packages,但似乎尚未讨论过这个问题。

更新:根据 cmets 的要求,以下是一些示例文件:

Test1.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个这样的文件(当然,内容更多;-)),这就是为什么我正在寻找自动化解决方案。

【问题讨论】:

我认为这有点不可能,您必须创建一个程序来为您自动执行这些操作。 你能添加一些你的java文件的结构吗?@O.R.Mapper @Mahan:嗯,是的,我正在寻找 Eclipse 中的相应功能;由于有各种可用的导入功能,很难想象没有这么简单的东西。 @theunlucky:请澄清;您是指一些示例文件吗? @theunlucky:我添加了一些示例文件的源代码来说明问题。 【参考方案1】:

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

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

    下一步

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

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

    完成

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

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

    选择“Java 构建路径”

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

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

    完成

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

使用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());
        
    

【讨论】:

这不起作用。我不断收到“声明的包...与预期的包...不匹配”编译器错误,并且源文件夹中的所有文件都添加到单个包中,而不是package 指令中声明的单个包中在各种源文件中。 为我工作。那么,您的文件是否在适当的目录中(即目录中的每个源文件都根据该源文件的包指令中定义的内容)?如果不是,那么这就解释了为什么它对你不起作用! 不,所有文件都在一个目录中,无论它们声明的命名空间如何。请看我的问题:“将所有[示例文件,具有不同声明的包]放在同一个目录中,然后尝试将它们导入 Eclipse 中的 Java 项目,而无需手动为各种包创建目录。”为了复制我的情况。 好的。答案已更新以运行程序以创建包目录。 Eclipse 并不是开箱即用的 AFAIK。【参考方案2】:

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

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

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

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

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

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

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

在这里我给你一些BASH guide以刷新你的想法

祝你好运,2013 年新年快乐

【讨论】:

【参考方案3】:

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

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

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

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

在我的测试中,它与健全的文件完美配合。 请注意,我还没有进行任何错误处理,因此是第四个,但请随时贡献。

祝你好运

【讨论】:

干得好!如果你能把它转换成一个在导入时执行它的 Eclipse 插件会更好...... :-) 我想在教育环境中使用它。这是允许的吗? 不管上述问题如何,我都会接受这个作为选择的答案。话虽如此,我当然不打算提出请为我编写代码类型的问题,尽管这个最终被接受的答案实际上是一个问题。但是,由于我的问题本身无法回答(Eclipse 中以前存在的功能),因此此响应是最实用的,并且最接近最初希望的答案。 “我想在教育环境中使用它。”请随意使用,整个 LICENSE 大部分都是出于习惯 :-) @O.R.Mapper 好吧,我认为有人已经为我们做了一些我们之前想做的事情 =)【参考方案4】:

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

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

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

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

【讨论】:

谢谢;我对相应算法的工作方式做出了或多或少相同的假设。不过,我想避免那种类似样板的工作,因此寻找一种方法来做到这一点,我希望在我的问题中已经将其集成到 Eclipse 中。 嗯,这对任何 IDE 来说都是一个很有前途的功能,但对我来说,已经开始创建应用程序来完成这项任务比等待一个可能不存在的东西要好得多【参考方案5】:

根据这个link你可以得到你真正想做的事情。

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

然后

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

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

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

希望对你有用!!

【讨论】:

这两种解决方案都不适合我。编译器为每个.java 文件输出错误声明的包“...”与预期的包“” 不匹配(其中... 是每个文件的相应包)。 哦.. 看到您对问题的更新我现在明白您希望根据提到的包在一堆 java 类的层次结构中自动创建目录... 您的问题已经在here 和here 讨论过。所以总而言之,我们必须等待 eclipe 中的此类功能出现:) 有趣的链接。第一种情况相同,但寻找相反的解决方案(在保留目录结构的同时更改包声明);如果 Eclipse 认为各种错误足够相似,可以对所有错误应用相同的修复,那么第二个会很有帮助。不幸的是,这些链接确实暗示这样的功能还不是 Eclipse 的一部分——尽管如此,在接受答案之前,仍然希望再有几天的插件。【参考方案6】:

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

【讨论】:

不幸的是,即使 Eclipse Juno 也说 所选问题没有通用的适用快速修复程序。,即使编译器错误相同,只是引用的声明包不同对于每个文件。逐个文件处理大约 100 个文件(每周...)对我来说仍然有点乏味 ;-)

以上是关于将 .java 文件导入正确的包中的主要内容,如果未能解决你的问题,请参考以下文章

java web项目中lib下导入的包部分没进去Referenced Liberaries 有影响吗?这样能算是包导入得正确吗?

Java中的包

戈朗。从包中只导入一个文件

eclipse中怎么在一个已经存在的项目的包中再添加一个包,如图:

如何在Jsp页面中导入JAVA类

Java中如何导入自己写的包