代码之家  ›  专栏  ›  技术社区  ›  jprete

基于一个源文件的依赖项创建JavaEclipse项目的子集

  •  4
  • jprete  · 技术社区  · 16 年前

    我有一个库Eclipse项目/工作区,其中包含偶尔交付给客户的功能。我们都是研究人员,所以这是非常非正式的;我用文档制作了一个JAR和一个Word文件,并将其发送给他们。

    我更愿意给他们发送一个只包含他们实际需要的JAR文件,以简化事情。如果他们需要类X、Y、Z和W,那么我会发送一个JAR文件,其中包含X、Y、Z和W,以及它们所依赖的所有类。

    现在我正在以一种无可救药的手动方式来做这件事(我创建了一个新项目,拖拽X、Y、Z和W,然后拖拽我需要修复编译器错误的任何东西)。在Eclipse中实现自动化的正确方法是什么?

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

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

    5 回复  |  直到 16 年前
        1
  •  3
  •   Jeff Axelrod    14 年前

    一个Eclipse插件Byecycle会有所帮助,但它已经从Sourceforge中删除。不是为了得到一个彻底的自动化过程,而是为了确定依赖关系。我不确定你是否能在Ganymede/Galileo上使用它,因为我很久以前就用过它了。

    这个 Class Dependency Analyzer 这个工具可能会更有帮助,因为它附带了一个插件扩展API 可以使用 创建一个插件以准确执行您想要执行的任务。

    更新#2

    类文件 . 请注意,这不会复制源文件。

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

        2
  •  2
  •   Ovi Tisler    16 年前

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

        3
  •  2
  •   Adam Paynter    16 年前

    您当前正在复制足够的类文件以使 编译程序 正在运行的应用程序 快乐的有些应用程序通过 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
      YourApplication
    

    这个 loaded_classes.txt 文件将如下所示:

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

    java. 包装。运行应用程序后,您可以让一个小程序自动复制此文件中提到的类。

        4
  •  2
  •   Community Mohan Dere    9 年前

    Eclipse enhancement request 支持这样的重构。同时,我发现了一些有希望的工具来帮助进行解耦和依赖性分析。

    相关问题: 1

        5
  •  1
  •   Mario Marinato    16 年前

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