2012-01-13 2 views
1

Можно ли написать плагин Eclipse, что:затмение плагина создание классов из используемого исходного кода Jar в

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

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

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

  4. При удалении банки все работает нормально.

Какое у вас решение для этого?

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



EDIT прояснить для @ Турбьёрна Равн Андерсен:

данный класс в баночке:

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 метод, который использует другой метод) этого класса jar:

package com.foo.bar; 

import com.ext.jar.Utilities; 

public class Runner { 

    public static void main(String[] args) { 

     Utilities.giveFirstThing(); 

    } 
} 

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

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

@ Thorbjørn Ravn Andersen, мне нужно скопировать код из банки, но только столько, сколько необходимо для компиляции и работы. Я не хочу включать эту банку в окончательную сборку. – dantuch

+0

Я знаю, что некоторые инструменты доступны для выполнения этой задачи (я забыл их имена). Тем не менее, это сложное упражнение, например: что, если ваш статический метод dymanically создает имя класса и загружает класс через отражение? – home

ответ

1

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

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

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

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

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

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

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

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

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

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

+0

Поскольку мои намерения вам не понятны, возможно, было бы легче, если бы я сказал вам, почему мне нужен такой инструмент. В нашей компании есть несколько классов Utility (в jar *), которые принадлежат только нам. Если мы делаем что-то для клиента, это может быть сделано с помощью этих классов, мы их используем. Ключевым моментом является то, что клиенту должны быть предоставлены только необходимые методы, только столько, сколько необходимо для компиляции. Мы делаем это путем копирования-вставки copy-paste copy-paste и организации импорта. Я хочу сделать это автоматически. Вы использовали некоторые из этих методов - класс создается вне jar * внутри проекта. И команде сборки не нужен jar * – dantuch

+0

Итак, я предположил, что некоторый eclipse-plugin, используемый случайными разработчиками, был бы лучшим и легким в использовании инструментом. – dantuch

+0

Вы распространяете исходный код для клиента? – binarycreations