基于一个源文件的依赖关系创建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