簡體   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