2012-12-19 15 views
17

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

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

我试图从文件系统特征进口以及将文件复制到项目中,所有这些都将文件放置在default包,而不是那些ecplicitly在package声明每个顶部声明文件。

相关SO问题只与referencing packages outside of the project's src directory hierarchymanually creating files in the suitable package directorymissing import statements,或bulk-renaming packages处理,但它似乎并不像这个问题已经讨论过了。

更新:正如意见中的要求,这里有一些例子文件:

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

+3

我觉得这是有点不可能,你必须创建一个程序,它会为你自动完成这些事情。 –

+2

可以请你添加你的一堆java文件的结构看起来像它的包?@O.R.Mapper – gks

+0

@Mahan:好的,我正在寻找Eclipse中的相​​应功能;因为有各种可用的导入功能,不可思议的是,那些简单明了的东西不会存在。 –

回答

8

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

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

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

要执行它,你将复制/粘贴你在所有的.java文件的文件夹中的可运行的.jar,并与Java运行-jar OrganizeJavaSources.jar从提示或命令行。它应该可以在Linux和Windows(也可能是MacOS)下工作。

在我的测试中,它完美地处理了理智的文件。 请注意我没有做任何错误处理,所以第四,但随时可以贡献。

好运

+2

不错的工作!如果你可以将它转换为一个Eclipse插件,并在导入时执行此操作,那么它会更好:...) –

+0

我想在教育环境中使用它。这是否允许? –

+0

不管上述问题,我都会接受这个选择的答案。也就是说,我的意图不是要求*请为我写*我的代码类型的问题,尽管这最终被接受的答案实际上是一个问题。但是,由于我的问题无法回答(以前Eclipse中的现有功能),因此这种响应最实用且最接近最初希望得到的答案。 –

2

那么我们是程序员在这里吧?所以迄今为止,我做了一项研究,在任何IDE中都很难找到这种功能,因为程序员必须警告他将java文件放在不正确的包中,并且不能自动为编程人员安排它。

那么我建议你创建一个简单的java控制台程序,可以为你做文件操作,我知道它对你来说很容易。这将是该计划

  1. 的可能的算法读取一个.java文件
  2. 检查package线,直到上的.java文件
  3. 终止;根据包名重定位文件,以及更换带目录分隔符的.可用作要重定位文件的地址。
  4. 如果文件的重定位文件夹不存在,请创建该文件夹
  5. 重复执行此操作,直至重新定位所有文件。

那么我也希望这种功能不仅在eclipse中,而且在其他IDE的好病人等待这个问题的进一步答案。

+2

谢谢;我对各自的算法如何工作做出或多或少的假设。但是,我想避免类似于样板的工作,因此希望找到一种方法来实现,我希望在我的问题中已经集成在Eclipse中。 –

+0

对任何IDE来说这都是一个很有希望的功能,但对于我来说,开始创建已经完成此任务的应用程序要比等待某个事物好得多,可能并不存在 –

1

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

+0

不幸的是,即使Eclipse Juno也说过*所选问题没有一个常用的快速修复*,即使编译器错误是相同的,并且仅仅因为每个文件的引用声明包而不同。按文件逐个文件地处理大约100个文件(每周一次......)对我的口味来说仍然有点乏味;-) –

2

根据这link你可以得到你真正想要做的。

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

然后

文件 - >新建文件夹,单击“高级”,然后选择“链接文件系统文件夹”。

后的文件夹并右击选择构建路径 - >用作源文件夹.. 也就是说它..

OR

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

我希望它适合你!

+0

这两种解决方案都不适合我。编译器输出错误*声明的包“...”与每个'.java'文件(其中* ... *是每个文件的相应包)中的预期包“”*不匹配。 –

+0

哦..看到你的更新问题,我现在明白,你想根据他们提到的包自动创建在束Java类的层次结构中的目录... – DarkHorse

+0

您的问题已经被讨论[这里](http://stackoverflow.com/questions/6865694/eclipse-how-to-change-package-declaration-to-across-an-entire-project)和[here](http://stackoverflow.com/questions/6761639/eclipse-ide-quick-全部修复)。所以总而言之,我们必须等待eclipe中的这个功能来:) – DarkHorse

1

所以这是我做过什么...

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

  2. Next

  3. 选择“Link additional source”(详情下)

  4. 浏览“链接的文件夹位置”,然后选择顶层文件夹(包含所有你的包等)

  5. 完成

如果你已经有一个项目创建,然后...

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

  2. Sel ECT“Java构建路径”

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

  4. 浏览“链接的文件夹位置”,然后选择顶层文件夹(包含所有你的包等。)

  5. 完成

如果你的文件不在对应于在其中定义的包目录,然后将你的文件(即备份他们全部复制到另一个目录),试试这个:

编译与的javac MakePackDirs.java下面的程序并使用的java MakePackDirs和目录和文件结构运行将被创建根据包d如上所述,然后使用程序。

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()); 
     } 
    } 
} 
+0

这不起作用。我不断收到“声明的包与预期的包不匹配......”编译器错误,并且源文件夹中的所有文件都被添加到单个包中,而不是在'package'指令中声明的单个包在各种源文件中。 –

+0

适合我。那么,您的文件是否位于相应的目录中(即根据该源文件的package指令中定义的内容,目录中的每个源文件)?如果不是这样,那么为什么不适合你! – xagyg

+0

不,所有文件都在一个目录中,而不管它们声明的名称空间。请参阅我的问题:“将所有[示例文件与声明不同的包]放在同一个目录中,然后尝试将它们导入到Eclipse中的Java项目中,而无需手动为各个包创建目录。”以复制我的情况。 –

2

你需要破解。 我希望你使用Linux,否则将是比较困难:)

1 - 创建一个小的java程序,读取并执行一个sh文件 这里的片段,展示了如何atemp从阅读脚本

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

2 - 创建脚本.SH并确保Java是正确的选择它(只需把脚本中的一些回声消息,并确认其正在打印)

3-目标与此黑客是尝试使用全部读取的grep将扩展名为.java的文件传输到mv程序,该程序将把它们放入正确的文件夹中。

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

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

我在这里结束了,你一定BASH guide刷新你的头脑

祝你好运,幸福的新2013