基于一个源文件的依赖关系创建Java Eclipse项目的子集

我有一个Eclipse Eclipse项目/工作区,其中包含偶尔提供给客户的function。 我们都是研究人员所以这是非常非正式的; 我用文档制作一个JAR和一个Word文件,然后发送给他们。

我更喜欢向他们发送一个只包含他们实际需要的JAR文件,以简化操作。 如果他们需要X,Y,Z和W类,那么我发送一个包含X,Y,Z和W的JAR文件,以及它们所依赖的所有类。

现在我以无望的手动方式执行此操作(我创建一个新项目,拖动X,Y,Z和W,然后拖动我需要修复编译器错误的任何内容)。 在Eclipse中自动化它的正确方法是什么?

编辑:为了清楚起见,涉及的Eclipse项目包含的内容比客户实际需要的多得多。

编辑:此外,没有涉及反思; 我可以确信编译器知道发生了什么。 我是那个编写代码的人,我避免像瘟疫这样的反思。 我使用reflection的唯一地方是模仿Collections.toArray(),在这种情况下,唯一可能导致问题的类是用户提供的类。

Byecycle,Eclipse插件会有所帮助,但它已从Sourceforge中删除。 不是在获得彻底的自动化过程,而是在确定依赖关系。 我不确定你是否可以让它在Ganymede / Galileo上工作,因为我已经使用了很长时间了。

更新

类依赖性分析器工具可能会更有用,因为它附带了一个插件扩展API, 可用于创建插件以执行您打算执行的任务。

更新#2

如果您想知道Ant的用法,可以使用ClassFileSet类型来获取类及其依赖项列表。 这可以在复制任务中引用,以复制所需的类文件 。 请注意,这不会复制源文件。

在内部,此方法依赖于BCEL库 ,因此,如果您希望执行源代码的副本,则可以尝试编写代码来检查.class文件的依赖项,并将源代码复制到另一个目录。

您可以使用Ant来自动执行此类操作

您当前正在复制足够的类文件以使编译器满意。 但是,您确定要复制足够的类文件以使正在运行的应用程序满意吗? 一些应用程序在运行时通过reflection加载它们的类:

String className = "org.my.company.Foo"; Class fooClass = Class.forName(className); Object foo = fooClass.newInstance(); 

在此示例中,即使您不复制org.my.company.Foo类,编译器也不会抱怨。 但是, 正在运行的应用程序肯定会在找不到类时抱怨。

如果要同时适应这两种情况,可以尝试编写一个自定义ClassLoader ,记录正在运行的应用程序正在加载的所有类:

 public class RecordingClassLoader extends ClassLoader { private FileWriter classNameWriter; public RecordingClassLoader(ClassLoader parent) throws IOException { super(parent); classNameWriter = new FileWriter(System.getProperty("loaded.classes.file", "C:\\classes.txt")); } @Override public Class loadClass(String name) throws ClassNotFoundException { try { classNameWriter.write(name); classNameWriter.write("\r\n"); classNameWriter.flush(); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("Could not record class loading", e); } return super.loadClass(name); } } 

然后,您可以像这样运行您的应用程序:

 java的
   -Djava.system.class.loader = RecordingClassLoader
   -Dloaded.classes.file = loaded_classes.txt
  你的申请

loaded_classes.txt文件看起来像这样:

 java.lang.System中
 java.nio.charset.Charset中
 java.lang.String中
 ...
 ...
你的申请

您可以修改类加载器以忽略从java.加载的任何类java. 包。 运行应用程序后,您可以使用一个小程序自动复制此文件中提到的类。

使用“导出”命令时,您可以选择在生成的JAR中包含哪些文件。

我提交了一个Eclipse增强请求来支持这种重构。 与此同时,我找到了一些有用的工具来帮助解耦和依赖性分析。

  • eDepend是一个依赖查看器插件,它包含一个类/包依赖关系图,它显示元素依赖关系,与库/其他项目的关系以及依赖关系周期。 它还可以列出导致依赖关系的查找类。
  • Java的STAN结构分析
  • nWire
  • 类依赖性分析器
  • 依赖性查找器

相关问题: 1