繁体   English   中英

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

[英]eclipse plugin creating classes from jar's used source code

是否可以编写Eclipse插件:

  1. 每当在我们的代码中,我们使用ClassA.staticMethod1(); ClassA来自随附的外部jar)

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

  3. 它将一个使用过的方法(以及所有需要的导入和相关方法)从jar复制到新创建的ClassA不需要的类方法不会复制到项目中,而是仍在外部jar中。

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

您要实现此目标的解决方案是什么?

提前致谢



编辑以澄清@ThorbjørnRavn Andersen:

给定的类在一个罐子里:

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:我添加了赏金,以表示我希望找到解决此问题的方法,我认为这可能是有用的开源项目。 :)

尽管我确信您可能可以编写一个Eclipse插件来完成所需的工作,但这听起来像很多您不需要做的工作。

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

  1. 减小该库的整体大小,从而减小应用程序的整体大小。
  2. 无需链接到外部库的能力

从本质上将外部jar库减少为仅需要的核心功能的想法基本上是混淆处理的作用之一。 Java有许多开放源代码混淆工具,最流行的可能是Proguard Proguard是高度可配置且有用的工具,可用于删除收缩代码,对其进行优化然后对其进行混淆。

来自混淆工具的当前代码的缩减将实现我认为您正在尝试实现的第一个目标。

最重要的是,与插件描述的技术相比,混淆工具可以获得更好的结果。 在此处查看Proguard的一些结果。

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

需要评估对大型项目中库的依赖(例如风险等),并最终需要进行管理。 通过删除不需要的部分来编辑库的想法可能会使您面临违反许可证的危险。 如果原始库丢失并且存在的只是创建的类,那也将是一场绝对的噩梦。

陈述应用程序所依赖的内容并使用库依赖工具会容易得多。 Apache Ivy是执行此操作的工具,它通过显示应用程序的依赖项并快速为他们提供获取这些库的简便方法,最终帮助与您合作的其他人。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM