2012-01-13 2 views
1

이클립스 플러그인을 작성이 가능할 것이다 :이클립스 플러그인은

우리의 코드에서 우리는 ClassA.staticMethod1();

  • (ClassA 포함 외부 항아리에서 온) 사용할 때마다

    1. 플러그인은 프로젝트에서 ClassA을 생성합니다.

    2. jar에서 새로 생성 된 객체 인 ClassA 만 사용합니다. 불필요한 클래스 메소드는 프로젝트에 복사되지 않고 여전히 외부 병에 있습니다.

    3. 항아리가 제거되면 모두 정상적으로 작동합니다.

    해결 방법은 무엇입니까? 사전에

    감사



    편집는 @ Thorbjørn Ravn 안데르센에 대해 명확히 :

    지정된 클래스가 항아리에 있습니다 (소스 프로젝트)

    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(); 
    
        } 
    } 
    

    결과입니다 : 항아리에서 클래스는 내가 필요하지 않았다, 방법 및 수입하지 않고, 일반 컴파일 가능한 클래스로, 내 프로젝트에서 다시 만들어집니다 (그래서 항아리 안전 프로젝트에서 제거 할 수 있습니다) :

    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;   
        } 
    
    } 
    

    SUM UP :

    2가 복사되도록, 필요한 방법 (총 4).

    (총 6 개) 필요한 곳에서 가져 오기 때문에 복사됩니다.

    나머지 클래스는 ATM에서 쓸모가 없으므로 나머지는 복사되지 않습니다.

    EDIT2 : 내가이 오픈 소스 프로젝트에 도움이 될 수 있다고 믿는이 문제에 대한 해결책을 찾고 싶다는 표시로 bounty를 추가했습니다. :)

  • +1

    자동 스텁 생성기가 필요합니까? –

    +0

    @ Thorbjørn Ravn Andersen, jar에서 코드를 복사해야하지만 컴파일하고 작업하는 데 필요한만큼만 복사해야합니다. 최종 빌드에이 항아리를 포함시키고 싶지 않습니다. – dantuch

    +0

    나는 그 일을 성취 할 수있는 도구가 있다는 것을 알고있다. (나는 그들의 이름을 잊었다). 그럼에도 불구하고 이것은 힘든 훈련입니다. 예를 들어, 정적 메서드가 동적으로 클래스 이름을 만들고 리플렉션을 통해 클래스를로드하면 어떻게됩니까? – home

    답변

    1

    필자가 원하는 것을하기 위해 이클립스 플러그인을 작성할 수 있다고 확신하지만, 그렇게 할 필요가없는 많은 작업처럼 들린다.

    1. 응용 프로그램의 전체 크기를 줄일 따라서 해당 라이브러리의 전체 크기를 줄입니다

      난 당신이 설명하는 플러그인은 기본적으로 두 가지를 달성하기 위해 노력하고있다 생각합니다.

    2. 기본적으로 필요한 경우에만 핵심 기능에 외부 항아리 라이브러리를 줄이는 아이디어 외장 라이브러리

    에 연결이 필요하지 할 수있는 능력은 난독가 사용되는 것을 기본적으로 하나 개의 역할이다. 많은 오픈 소스 난독 화 도구가 Java에서 가장 많이 사용되는데 아마도 Proguard입니다. Proguard는 축소 형 코드를 제거하고이를 최적화 한 다음이를 obfusticate하는 데 사용할 수있는 구성 가능하고 유용한 도구입니다.

    난독 화 도구에서 현재 코드를 축소하면 달성하려는 첫 번째 목표를 달성 할 수 있습니다.

    난독 화 도구를 사용하면 플러그인에서 설명한 기술보다 훨씬 나은 결과를 얻을 수 있습니다. Proguard here의 결과를 참조하십시오.

    달성하려는 두 번째 목표는 다소 이상하게 보입니다. 외부 라이브러리를 사용할 때도 아무런 문제가 없습니다. 개발 관점에서 애플리케이션 의존성이 무엇인지 알고 싶습니다.

    큰 프로젝트의 라이브러리에 대한 종속성을 평가해야합니다 (예 : 위험 등). 궁극적으로 관리해야합니다. 필요하지 않은 부분을 제거하여 라이브러리를 편집하면 라이센스를 파손 할 위험이 있습니다. 원래 라이브러리가 손실되고 존재하는 모든 것이 생성 된 클래스 인 경우 절대적인 악몽이 될 수도 있습니다.

    라이브러리 의존성 도구를 사용하면 응용 프로그램이 무엇인지를 쉽게 알 수 있습니다. Apache Ivy은이를 수행하고 궁극적으로는 공동 작업하는 다른 사람들을 돕는 도구입니다. 응용 프로그램의 의존성을 보여주고 해당 라이브러리를 쉽게 얻을 수있는 방법을 제공합니다.

    이러한 유형의 도구는 사용해야하는 종속성과 특정 버전이 많은 대규모 프로젝트에서 사용되는 경향이 있습니다. 소규모 프로젝트의 경우 대부분 프로젝트 독해 또는 빌드 지침에 하나 또는 두 개의 라이브러리 만 있으면됩니다.

    +0

    내 의도가 분명하지 않기 때문에 내가 왜 그런 도구가 필요한지 말해 준다면 더 쉬울 것입니다. 우리 회사에는 우리에게만 속한 Utility 클래스가 있습니다 (jar *). 우리가 고객을 위해 뭔가를하면,이 수업의 도움으로 끝낼 수 있습니다. 우리는 그것을 사용합니다. 요점은 컴파일하는 데 필요한만큼 필요한 메서드 만 클라이언트에 제공해야한다는 것입니다. 우리는 복사 - 붙여 넣기 복사 - 붙여 넣기 복사 - 붙여 넣기 및 가져 오기 구성을 수행합니다. 나는 이것을 자동으로 만들고 싶다. 당신은 그 중 몇 가지 방법을 사용했습니다 - 클래스는 프로젝트의 내부에서 단지 * 밖에서 만들어집니다. 그리고 빌드 팀은 병이 필요하지 않습니다. – dantuch

    +0

    그래서 임의의 개발자가 사용하는 일부 Eclipse 플러그인이 도구를 사용하는 것이 가장 좋고 도구가 많을 것이라고 생각했습니다. – dantuch

    +0

    소스 코드를 클라이언트에 배포합니까? – binarycreations