2013-09-30 7 views
7


मेरे जावा (चींटी) प्रोजेक्ट से अप्रयुक्त जार को हटाने के लिए सबसे आसान तरीका (टूल?) क्या है। हमारी परियोजना वास्तव में बड़ी हो गई है, और हम एक साफ करना चाहते हैं। क्लासपाथ में जोड़े गए कई जार हैं, लेकिन सभी का उपयोग संकलन/चलाने के लिए नहीं किया जाता है। कमांड लाइन से कुछ उपयोगिता चलाकर अनावश्यक जार की पहचान करने का कोई तरीका है?
नोट: हम एक या एक से अधिक जार को हटाने की कठिन प्रक्रिया का पालन नहीं करना चाहते हैं, फिर परीक्षण करने के लिए संकलित/चलाएं यदि आवश्यक हैं या नहीं।परियोजना से अप्रयुक्त जार हटाएं

उत्तर

9

यह मैं अंत में
मैं JBoss Tattletale (http://www.jboss.org/tattletale) का इस्तेमाल किया संकलन समय पर अप्रयुक्त जार पहचान करने के लिए क्या किया है (यह अप्रयुक्त के रूप में 17 जार सूचना)।
फिर उस सूची में प्रत्येक जार के लिए, मैंने अपने प्रोजेक्ट पर स्ट्रिंग सर्च किया ताकि यह पता चल सके कि जार का उच्चतम पैकेज स्तर कहीं भी इस्तेमाल किया गया था (यह देखने का प्रयास है कि इस जार से संबंधित कोई वर्ग प्रतिबिंब का उपयोग करके लोड किया गया था या नहीं)।
इस तरह से मैं अपनी परियोजना से 6 जार सफलतापूर्वक खत्म करने में सक्षम था।
चूंकि, संकलित समय पर अप्रयुक्त जार की संख्या छोटी थी, यह दृष्टिकोण त्वरित था।

+0

टटल टेल नियम –

+0

शांत, सुझाव के लिए धन्यवाद। क्या आप इसका एक छोटा सा उदाहरण दे सकते हैं कि आप इसका उपयोग कैसे करते हैं? –

+0

उदाहरण के लिए टोमकैट के साथ, जेबीएसएसएसएस के बाहर टैटलेटेल का उपयोग किया जा सकता है? – user7294900

4

यदि इसके लिए कोई बेहतर समाधान है, तो मुझे यह सुनना अच्छा लगेगा।

समस्या यह है कि एक जार करने की जरूरत नहीं है, भले ही संकलन है, यह रन करने के लिए आवश्यक हो सकता है। और यह "जरूरत" संक्रमणीय हो सकती है। ईजी: आपके द्वारा उपयोग किए जाने वाले एक जार को एक जार की आवश्यकता होती है जिसका आप उपयोग नहीं करते हैं और केवल रनटाइम पर। जैसा कि रनटाइम त्रुटियों की प्रकृति है, वे कोड को निष्पादित करने का प्रयास करते समय केवल खुद को प्रकट करेंगे। सबसे खराब मामला, यह तब तक नहीं हो सकता जब तक कि आप उत्पादन में नहीं चल रहे हों।

सबसे अच्छा समाधान जो मैं जानता हूं वह वही है जो आप नहीं करना चाहते हैं: "एक या एक से अधिक जार हटाएं, फिर संकलित करें या जांचें कि परीक्षण करने के लिए या नहीं"।

2

निकालें -> टेस्ट -> निकालें -> टेस्ट -> निकालें -> आशा है कि आप maven और केवल जार आप उपयोग करना चाहते हैं का चयन करने के :)

परियोजना बदलें का आनंद लें। मेरे लिए यह सबसे आसान तरीका है।

1

जैसा कि उनके उत्तर में टाईटीटीटी द्वारा उल्लेख किया गया है, कई जारों को केवल संकलन समय पर ही जरूरी है। (उदाहरण के लिए जेडीबीसी कार्यान्वयन जार)

एक अन्य दृष्टिकोण जावा एजेंट लिखना और सभी वर्गनामों को इकट्ठा करना हो सकता है। फिर आप इन कक्षाओं को जार में मैप कर सकते हैं और देख सकते हैं कि किसी भी जार की आवश्यकता नहीं है या नहीं।

नमूना एजेंट

package com; 

import java.lang.instrument.ClassFileTransformer; 
import java.lang.instrument.IllegalClassFormatException; 
import java.lang.instrument.Instrumentation; 
import java.security.ProtectionDomain; 


public class NameAgent { 


    public static void premain(String agentArgs, Instrumentation inst) { 

     inst.addTransformer(new Tranformer(), true); 
    } 


    static class Tranformer implements ClassFileTransformer { 

     @Override 
     public byte[] transform(ClassLoader loader, 
           String className, 
           Class<?> classBeingRedefined, 
           ProtectionDomain protectionDomain, 
           byte[] classfileBuffer) throws IllegalClassFormatException { 
      System.out.println("loading-class:" + className); 
      return classfileBuffer; 
     } 
    } 

} 

build.xml ... चींटी

<project name="namedump" default="dist" basedir="."> 

    <property name="src" value="src"/> 
    <property name="build" value="build"/> 
    <property name="dist" value="dist"/> 

    <target name="init"> 
     <mkdir dir="${build}"/> 
     <mkdir dir="${dist}"/> 
    </target> 

    <target name="compile" depends="init"> 
     <javac srcdir="${src}" destdir="${build}" optimize="true" includeantruntime="false"/> 
    </target> 

    <target name="dist" depends="compile"> 
     <jar jarfile="${dist}/namecollector.jar"> 
      <fileset dir="${build}"/> 
       <manifest > 
        <attribute name="Premain-Class" value="com.NameAgent" /> 
        <attribute name="Can-Redefine-Classes" value="true" /> 
        <attribute name="Can-Retransform-Classes" value="true" /> 

       </manifest> 
     </jar> 
     <pathconvert property="absdist" dirsep="/"> 
      <path location="${dist}"/> 
     </pathconvert> 
     <echo> 
      To use, add the following to the JVM command-line options. 

      -javaagent:${absdist}/namecollector.jar 
     </echo> 
    </target> 

    <target name="clean"> 

     <delete dir="${build}"/> 
     <delete dir="${dist}"/> 
    </target> 
</project> 

एक और दृष्टिकोण हम खिड़कियों में करने की कोशिश की तथ्य यह है कि जार जब कक्षाओं लोड किए गए हैं नहीं पहुंच पाते उपयोग कर रहा था के लिए। एप्लिकेशन चलाएं और रनटाइम क्षेत्र से हटाने का प्रयास करें। अगर इसका इस्तेमाल किया गया था, तो हटाएं विफल होना चाहिए। यह सुनिश्चित नहीं है कि यह कितना सुरक्षित है- मुझे पता है कि यह लिनक्स आदि पर काम नहीं करता है, फ़ाइलों को बिना किसी समस्या के हटाया जा सकता है।

+0

आपके उत्तर के लिए धन्यवाद, अगली बार इसे आजमाएं! – flowerpot

संबंधित मुद्दे