Плагин Eclipse для создания классов из исходного кода jar - PullRequest
1 голос
/ 13 января 2012

Можно ли написать плагин Eclipse, который:

  1. Всякий раз, когда в нашем коде мы используем ClassA.staticMethod1(); (ClassA происходит из включенного внешнего jar)

  2. Плагин создает ClassA в нашем проекте.

  3. Он копирует только один использованный метод (и все необходимые импортные и зависимые методы) из jar во вновь созданный ClassA - ненужные методы класса не копируются в проект и все еще находятся во внешнем jar.

  4. Когда jar удален, все работает нормально.

Каково ваше решение для достижения этой цели?

спасибо заранее



РЕДАКТИРОВАТЬ , чтобы уточнить для @ Thorbjørn Ravn 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;        
    }       
}

Этот класс (в исходном проекте), который использует только часть (в данном случае 1 метод, который использует другой метод) класса этой банки:

package com.foo.bar;

import com.ext.jar.Utilities;

public class Runner {

    public static void main(String[] args) {

        Utilities.giveFirstThing();

    }
}

Результат: класс из jar воссоздается в моем проекте как обычный компилируемый класс без методов и Imports, которыйМне не нужно (, поэтому банку можно безопасно удалить из проекта ):

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 всего) импортирует, где это необходимо, поэтому они тоже копируются.

остальная часть класса является бесполезной для банкомата, поэтому все остальное не копируется.

РЕДАКТИРОВАТЬ 2: Я добавил щедрость, в знак того, что я хочу найти решение этой проблемы, что я считаю, может быть полезным проектом с открытым исходным кодом.:)

1 Ответ

1 голос
/ 16 января 2012

Хотя я уверен, что вы, вероятно, могли бы написать плагин Eclipse, чтобы делать то, что вам нужно, это звучит как большая работа, которую вам не нужно делать.

Я думаю, что плагин, который вы описываете, по сутипытаясь достичь двух вещей:

  1. Уменьшите общий размер этой библиотеки, таким образом, уменьшив общий размер вашего приложения.
  2. Возможность не требовать ссылки на внешнюю библиотеку

Идея существенного сокращения внешней библиотеки jar только до тех основных функций, которые вам необходимы, - это, по сути, одна из ролей, для которой используется запутывание.Для Java доступно множество инструментов обфускации с открытым исходным кодом, наиболее популярным из которых является Proguard .Proguard - это настраиваемый и полезный инструмент, который можно использовать для удаления сжатого кода, его оптимизации и затем обфускации.

Сокращение текущего кода из инструмента запутывания позволит выполнить первую цель, которую, я думаю, вы пытаетесь достичь.

Вдобавок к этому инструменты запутывания дадут намного лучшие результаты, чем методика, описанная плагином.Смотрите некоторые результаты Proguard здесь .

Вторая цель, которую вы пытаетесь достичь, кажется немного странной.Также нет ничего плохого в использовании внешних библиотек.С точки зрения разработки вы хотите знать, каковы зависимости вашего приложения.

Зависимости от библиотек в больших проектах должны быть оценены (для таких вещей, как риск и т. Д.) И, в конечном счете, должны быть управляемы.Идея редактирования библиотеки путем удаления ненужных частей может поставить вас под угрозу взлома лицензий.Также было бы абсолютным кошмаром, если оригинальная библиотека потеряна, и все, что существовало, было созданными классами.

Было бы намного проще указать, что зависит от вашего приложения, и использовать инструмент зависимости от библиотеки. Apache Ivy - это инструмент, который делает это и, в конечном счете, помогает другим, с кем вы сотрудничаете, показывая, от чего зависит ваше приложение, и быстро предоставляя им простые способы получения этих библиотек.

Эти типы инструментов, как правило, используются в крупных проектах, где существует множество зависимостей и конкретных версий, которые необходимо использовать.Для небольших проектов вы в большинстве случаев обнаружите, что они требуют только одну или две библиотеки в проектах readme или инструкциях по сборке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...