创建基于一个源文件的依赖一个Java的Eclipse项目的一个子集(Create a subset

2019-07-04 21:11发布

我有一个偶尔交付给客户库Eclipse项目/含工作区功能。 我们所有的研究人员等等,这是非常非正式地进行; 我做一个JAR,并与文档Word文件,并将其发送给他们。

我更愿意给他们一个JAR文件,该文件只包含他们的实际需要,把事情简单化。 如果他们需要类X,Y,Z和W,然后我发送包含X,Y,Z和W的JAR文件,以及所有那些依赖于类。

现在我在绝望手工方式这样做(我创建了一个新的项目,在拖X,Y,Z和W,然后拖过任何我需要修复的编译器错误)。 什么是它在Eclipse中自动以正确的方式?

编辑:只要是明确的,涉及的Eclipse项目包含更多的班比客户的实际需要。

编辑:另外,也没有反射参与; 编译器知道是怎么回事,我可以有信心。 我是谁写的代码中的一个,我避免像瘟疫反射。 我用反射的唯一的地方是模仿Collections.toArray(),并且在这种情况下,可能会导致一个问题的唯一类是一个用户提供。

Answer 1:

Byecycle,一个Eclipse插件会有所帮助,但它已被从Sourceforge删除。 没有得到彻底的自动化过程,但在确定的依赖关系。 我不知道你是否能得到它的木卫三/伽利略的工作,因为我用这个很长一段时间了。

更新

本类相关分析工具可能被证明是更有帮助,因为它带有一个插件扩展API,它可以用来创建一个插件来执行完全相同,你打算做任务。

更新#2

如果你想知道关于蚂蚁的使用情况,您可以使用ClassFileSet类型得到一个类及其依赖的列表。 这可以在副本任务中被引用复制所需的类文件 。 请注意,这不会复制源文件。

在内部,这种方法依赖于BCEL库 ,因此,如果您希望执行的源副本,你可以尝试编写代码来检查.class文件的依赖关系,并转移到其他目录中复制源。



Answer 2:

您可以使用Ant的自动化这样的事情



Answer 3:

您正在复制足够的类文件,以使编译器高兴。 但是,你确定要复制足够的类文件,使运行应用程序幸福吗? 有些应用程序通过加载它们的类反射在运行时:

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
  YourApplication

loaded_classes.txt文件将是这个样子:

java.lang.System
java.nio.charset.Charset
java.lang.String
...
...
YourApplication

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



Answer 4:

当您使用导出命令你给出的选择,选择哪些文件包括在生成JAR。



Answer 5:

我提交了Eclipse的增强请求支持这种重构。 在此期间,我发现了一些有前途的工具来帮助解耦和依赖性分析。

  • eDepend是一个依赖观察者的插件,包括显示元件的依赖关系,使用库/其它项目和循环依赖关系的类/包依赖关系图。 它也可以列举导致依赖查找类。
  • STAN为Java结构分析
  • nWire
  • 类依赖分析仪
  • 依赖搜索

相关的问题: 1



文章来源: Create a subset of a Java Eclipse project based on dependencies of one source file