eclipse插件从jar使用的源代码创建类

时间:2012-01-13 14:37:54

标签: java eclipse eclipse-plugin

是否有可能编写Eclipse插件,即:

  1. 每当我们的代码中使用ClassA.staticMethod1();ClassA来自包含的外部jar)

  2. 插件在我们的项目中创建ClassA

  3. 它将一个仅使用的方法(以及所有需要的导入和依赖方法)从jar复制到新创建的ClassA - 不需要的类方法不会复制到项目中,并且仍然在外部jar中。 / p>

  4. 当罐子被移除时,一切正常。

  5. 您实现这一目标的解决方案是什么?

    提前致谢



    编辑澄清@ThorbjørnRavnAndersen:

    给定的课在罐子里:

    package com.ext.jar;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    public class Utilities {
    
        public static Object giveFirstThing(){
            // some random method content to show what has to be removed and what has to stay
            List list = new ArrayList();    
            Object o = doThis();
            return null;        
        }   
    
        public static Object giveSecondThing(){
            List list = new LinkedList();       
            Object o = doThat();
            return null;        
        }       
        private static Object doThis(){
            Map<Integer, String> myMap = new HashMap<Integer, String>();
            return null;        
        }
        private static Object doThat(String ... param){
            Set set;
            return null;        
        }       
    }
    

    此类(在源项目中),仅使用该jar类的部分(在本例中为1方法,使用其他方法):

    package com.foo.bar;
    
    import com.ext.jar.Utilities;
    
    public class Runner {
    
        public static void main(String[] args) {
    
            Utilities.giveFirstThing();
    
        }
    }
    

    结果是:jar中的类在我的项目中重新创建,作为一个普通的可编译类,没有方法和Imports,我不需要(所以jar可以安全地从项目中删除) :

    package com.ext.jar;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class Utilities {
    
        public static Object giveFirstThing(){
            // some random method content to show what has to be removed and what has to stay
            List list = new ArrayList();    
            Object o = doThis();
            return null;        
        }   
    
        private static Object doThis(){
            Map<Integer, String> myMap = new HashMap<Integer, String>();
            return null;        
        }
    
    }
    

    总结:

    2(总共4个)方法,如果需要,所以复制它们。

    4(总共6个)在需要的地方进口,因此它们也被复制。

    其他课程是ATM无用的,所以其他所有内容都不会被复制。

    EDIT2:我已经添加了赏金,作为我希望找到解决这个问题的标志,我认为这可能是有用的开源项目。 :)

1 个答案:

答案 0 :(得分:1)

虽然我确信您可能会编写一个Eclipse插件来执行您需要的操作,但这听起来像是您不需要做的很多工作。

我认为您描述的插件实际上是在尝试实现两件事:

  1. 减少该库的整体大小,从而减少应用程序的整体大小。
  2. 不需要链接到外部库的能力
  3. 基本上将外部jar库减少到您需要的核心功能的想法基本上就是使用混淆的一个角色。 Java最常用的许多开源混淆工具可能是Proguard。 Proguard是高度可配置且有用的工具,可用于删除收缩代码,优化然后对其进行定制。

    从混淆工具中缩小当前代码将实现我认为您正在努力实现的第一个目标。

    除此之外,混淆工具可以获得比插件描述的技术更好的结果。查看Proguard here的一些结果。

    你想要实现的第二个目标似乎有点奇怪。使用外部库也没有错。从开发的角度来看,您想知道您的应用程序依赖项是什么。

    需要评估大型项目中图书馆的依赖性(风险等等)并最终需要进行管理。通过删除不需要的部件来编辑库的想法可能会使您面临破坏许可证的危险。如果原始库丢失并且存在的所有内容都是创建的类,那么这也将是一场绝对的噩梦。

    说明应用程序所依赖的内容并使用库依赖项工具要容易得多。 Apache Ivy是一个工具,通过显示您的应用程序所依赖的内容,并通过快速简便的方式获取这些库,可以帮助与您合作的其他人。

    这些类型的工具往往用于需要使用大量依赖项和特定版本的大型项目中。对于小型项目,您最常发现他们声明项目自述文件或构建说明中只需要一个或两个库。