انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: اضافه کردن فایل jar در هنگام اجرا به برنامه (حل   (دفعات بازدید: 8563 بار)

0 کاربر و 3 مهمان درحال مشاهده موضوع.

آفلاین Hani

  • Full Member
  • *
  • ارسال: 147
    • وبلاگ شخصی هانی هاشمی
سلام :(

یه برنامه نوشتم برای طراحی وب و می خوام مثل netbeans , eclipse قسمت plugin داشته باشه  ](*,)  که متاسفانه به مشکلی برخوردم اونم اینه که نمی دونم چه جوری jar فایل های پلاگینم رو به برنامه اضافه کنم !!??

یعنی در هنگام اجرا آیا دستوری هست که بشه به library فایل jar اضافه کرد ؟؟؟ :'(
« آخرین ویرایش: 16 امرداد 1388، 03:01 ب‌ظ توسط Hani »

آفلاین کرگدن

  • High Hero Member
  • *
  • ارسال: 1769
  • جنسیت : پسر
سلام :(

یه برنامه نوشتم برای طراحی وب و می خوام مثل netbeans , eclipse قسمت plugin داشته باشه  ](*,)  که متاسفانه به مشکلی برخوردم اونم اینه که نمی دونم چه جوری jar فایل های پلاگینم رو به برنامه اضافه کنم !!??

یعنی در هنگام اجرا آیا دستوری هست که بشه به library فایل jar اضافه کرد ؟؟؟ :'(


درود

این امکان اگر اشتباه نکنم در جاوا ۶ نیست و فقط در حد کلاس هست ( البته کتابخانه های جانبی هست که این کاررو می کننن)
ولی این امکان در جاوا ۷ فراهم میشه

اگر دقت کنید در eclipse و netbeans هم شما باید نرم افزار رو دوباره راه اندازی کنید

 Vaio-VPCCW - core i7 -Nvidia GT320M -4GB -OS Fedora 20/ kde 4.12
Vbox: Centos 6.4 (server) / Archlinux

آفلاین سجاد

  • Sr. Member
  • *
  • ارسال: 319
  • جنسیت : پسر
  • نیست ‌بر لوح‌ دلم‌ جز الف‌ قامت ‌یار
    • http://sjb.ir
خیلی راحت در هنگام کامپایل از دستور javac -classpath که بعد از classpath- ادرس فولدری که jar فایلها در آن است را می دهی

javac -classpath \examples\lib\  \examples\greetings\Hi.java
که در بالا  \examples\lib\ همان فولدر است که jar فایلها در آن است و  examples\greetings\Hi.java\  هم فایلی است که قرار است کامپایل شود .

آفلاین سجاد

  • Sr. Member
  • *
  • ارسال: 319
  • جنسیت : پسر
  • نیست ‌بر لوح‌ دلم‌ جز الف‌ قامت ‌یار
    • http://sjb.ir
البته از Reflection هم میتوانید استفاده کنید .

آفلاین Hani

  • Full Member
  • *
  • ارسال: 147
    • وبلاگ شخصی هانی هاشمی
نقل‌قول
خیلی راحت در هنگام کامپایل از دستور javac -classpath که بعد از classpath- ادرس فولدری که jar فایلها در آن است را می دهی

کد:

javac -classpath \examples\lib\  \examples\greetings\Hi.java


که در بالا  \examples\lib\ همان فولدر است که jar فایلها در آن است و  examples\greetings\Hi.java\  هم فایلی است که قرار است کامپایل شود .

توی netbeans چطوری می تونم این کار بکنم ؟؟  :'(

ممنون

آفلاین Hani

  • Full Member
  • *
  • ارسال: 147
    • وبلاگ شخصی هانی هاشمی
یه مشکل دیگه  از کجا بفهمم چه فایلی با چه اسمی import شده ؟؟؟

آفلاین کرگدن

  • High Hero Member
  • *
  • ارسال: 1769
  • جنسیت : پسر
خیلی راحت در هنگام کامپایل از دستور javac -classpath که بعد از classpath- ادرس فولدری که jar فایلها در آن است را می دهی

javac -classpath \examples\lib\  \examples\greetings\Hi.java
که در بالا  \examples\lib\ همان فولدر است که jar فایلها در آن است و  examples\greetings\Hi.java\  هم فایلی است که قرار است کامپایل شود .

ایشون در زمان اجرا می خوان

تا جایی که من می دونم در نسخه ۶ فقط class loader داریم

البته از Reflection هم میتوانید استفاده کنید .

در ورژن ۶ فقط در زمان اجرا می تونه یک کلاس عوض بشه ( چون کلاس توسط jvm باید در حافظه load بشه و jvm فقط می تونه کلاس رو به روز کنه
البته همین امکان جالب هنوز در خیلی از نرم افزار ها پیاده نشده ( مثل tomcat و......)
در ورژن ۷ میشه jar فایل لود کرد

 Vaio-VPCCW - core i7 -Nvidia GT320M -4GB -OS Fedora 20/ kde 4.12
Vbox: Centos 6.4 (server) / Archlinux

آفلاین Hani

  • Full Member
  • *
  • ارسال: 147
    • وبلاگ شخصی هانی هاشمی
پاسخ به: اضافه کردن فایل jar در هنگام اجرا به بر&#
« پاسخ #7 : 11 امرداد 1388، 12:16 ب‌ظ »
نقل‌قول
ایشون در زمان اجرا می خوان

تا جایی که من می دونم در نسخه ۶ فقط class loader داریم

موقع اجرا هم بشه اشکال نداره . فوقش به کاربر می گیم که باید برنامه رو ریستارت کنه !!

ارش جان با دستور  classpath  (و به کمک netbeans)فولدر libم رو import کردم اما هر کاری می کنم نمی تونم به کلاسی که داخلش هست دسترسی داشته باشم در صورتی که فولدرم import شده و netbeans نشونش می ده.

کلاس اصلیم

package javaapplication9;
import javax.swing.JOptionPane;
public class Main {
    public static void main(String[] args) {
        Class clas = null;
try {
  clas = Class.forName("myjar.Main");
  JOptionPane.showMessageDialog(null, "OKOKOK LOL");

} catch (ClassNotFoundException ex) {
  JOptionPane.showMessageDialog(null, "Nistesh !!");
}
    }
}

کلاس import شدم
package myjar;
public class Main {
    public static void main(String[] args) {
        javax.swing.JOptionPane.showMessageDialog(null, "I am jar file");
    }
}
« آخرین ویرایش: 11 امرداد 1388، 02:41 ب‌ظ توسط Hani »

آفلاین Hani

  • Full Member
  • *
  • ارسال: 147
    • وبلاگ شخصی هانی هاشمی
پاسخ به: اضافه کردن فایل jar در هنگام اجرا به بر&#
« پاسخ #8 : 11 امرداد 1388، 04:11 ب‌ظ »
اینم عکسش




آفلاین کرگدن

  • High Hero Member
  • *
  • ارسال: 1769
  • جنسیت : پسر
الان چه مشکلی دارید؟ ClassNotFoundException  می ده؟
اگر ران میشه و مشکلی ندارید و فقط مشکل اینه که I am jar file نمابش داده نمیشه مشکل از ساختار کلاس و برنامتون هست
اگر exception می ده lib  رو درست add کنید به طوری که در پکیجی نیفته
الان برای شما درست add نشده ( فکر می کنم شما فولدر رو add کردید)

 Vaio-VPCCW - core i7 -Nvidia GT320M -4GB -OS Fedora 20/ kde 4.12
Vbox: Centos 6.4 (server) / Archlinux

آفلاین Hani

  • Full Member
  • *
  • ارسال: 147
    • وبلاگ شخصی هانی هاشمی
پاسخ به: اضافه کردن فایل jar در هنگام اجرا به برنامه
« پاسخ #10 : 11 امرداد 1388، 11:59 ب‌ظ »
نقل‌قول
الان چه مشکلی دارید؟ ClassNotFoundException  می ده؟

بله . کلاسو پیدا نمی کنه

نقل‌قول
اگر exception می ده lib  رو درست add کنید به طوری که در پکیجی نیفته
الان برای شما درست add نشده ( فکر می کنم شما فولدر رو add کردید)

بله درسته من فولدر رو add کردم  در پست اولم توضیح دادم می خوام تمام فایل های jarی که در این پوشه قرار می گیره رو به برنامم import کنم

آفلاین سجاد

  • Sr. Member
  • *
  • ارسال: 319
  • جنسیت : پسر
  • نیست ‌بر لوح‌ دلم‌ جز الف‌ قامت ‌یار
    • http://sjb.ir
پاسخ به: اضافه کردن فایل jar در هنگام اجرا به برنامه
« پاسخ #11 : 12 امرداد 1388، 12:18 ق‌ظ »
خیلی راحت در هنگام کامپایل از دستور javac -classpath که بعد از classpath- ادرس فولدری که jar فایلها در آن است را می دهی

javac -classpath \examples\lib\  \examples\greetings\Hi.java
که در بالا  \examples\lib\ همان فولدر است که jar فایلها در آن است و  examples\greetings\Hi.java\  هم فایلی است که قرار است کامپایل شود .

ایشون در زمان اجرا می خوان

تا جایی که من می دونم در نسخه ۶ فقط class loader داریم

البته از Reflection هم میتوانید استفاده کنید .

در ورژن ۶ فقط در زمان اجرا می تونه یک کلاس عوض بشه ( چون کلاس توسط jvm باید در حافظه load بشه و jvm فقط می تونه کلاس رو به روز کنه
البته همین امکان جالب هنوز در خیلی از نرم افزار ها پیاده نشده ( مثل tomcat و......)
در ورژن ۷ میشه jar فایل لود کرد

اتفاقا اساس TomCat بر reflection استوار است و تمام war فایلها بصورت reflective لود میشود .
jar فایل هم چیز عجیب غریبی نیست همون کلاس که اومدن یکپارچه کردند .( TomCat دقیقا برا war فایل این کارو میکند ( war فایل نسخه وب jar فایل است )

آفلاین کرگدن

  • High Hero Member
  • *
  • ارسال: 1769
  • جنسیت : پسر
پاسخ به: اضافه کردن فایل jar در هنگام اجرا به برنامه
« پاسخ #12 : 12 امرداد 1388، 01:08 ق‌ظ »
خیلی راحت در هنگام کامپایل از دستور javac -classpath که بعد از classpath- ادرس فولدری که jar فایلها در آن است را می دهی

javac -classpath \examples\lib\  \examples\greetings\Hi.java
که در بالا  \examples\lib\ همان فولدر است که jar فایلها در آن است و  examples\greetings\Hi.java\  هم فایلی است که قرار است کامپایل شود .

ایشون در زمان اجرا می خوان

تا جایی که من می دونم در نسخه ۶ فقط class loader داریم

البته از Reflection هم میتوانید استفاده کنید .

در ورژن ۶ فقط در زمان اجرا می تونه یک کلاس عوض بشه ( چون کلاس توسط jvm باید در حافظه load بشه و jvm فقط می تونه کلاس رو به روز کنه
البته همین امکان جالب هنوز در خیلی از نرم افزار ها پیاده نشده ( مثل tomcat و......)
در ورژن ۷ میشه jar فایل لود کرد

اتفاقا اساس TomCat بر reflection استوار است و تمام war فایلها بصورت reflective لود میشود .
jar فایل هم چیز عجیب غریبی نیست همون کلاس که اومدن یکپارچه کردند .( TomCat دقیقا برا war فایل این کارو میکند ( war فایل نسخه وب jar فایل است )

دوست عزیز فکر  کنم منظور من رو درست متوجه نشدید :)
مثال می زنم
شما وقتی یک servlet رو تغییر می دید برای استفاده از اون نیاز دارید  container رو دوباره راه اندازی کنید ( یا redeploy کنید )
چون کلاس های شما در حافظه لود نشده ( بر عکس jsp که خودش هر بار که نیاز باشه کامپایل می کنه و لودش می کنه )

اینم یک پلاگین برای این کار
http://www.zeroturnaround.com/javarebel/

war فایل هم ربطی به صحبت من نداشت :)
شاید منظورتون auto deploy باشه که با صحبت من فرق داره
در auto deploy  یکبار همه class ها لود میشن
ولی من منظورم به جز redeploy کردن هست
چون در این زمان محصولمون قادر به سرویس دهی  نیست و اگر با  jpa و.... آشنا باشید می دونید که در redeploy شدن پروژه داستان های زیادی داریم :)
ولی این امکانی که بنده می گم  jvm class رو خودش لود می کنه ( در runtime )

نقل‌قول
بله درسته من فولدر رو add کردم  در پست اولم توضیح دادم می خوام تمام فایل های jarی که در این پوشه قرار می گیره رو به برنامم import کنم
فردا توضیح می دم :)

 Vaio-VPCCW - core i7 -Nvidia GT320M -4GB -OS Fedora 20/ kde 4.12
Vbox: Centos 6.4 (server) / Archlinux

آفلاین Hani

  • Full Member
  • *
  • ارسال: 147
    • وبلاگ شخصی هانی هاشمی
پاسخ به: اضافه کردن فایل jar در هنگام اجرا به برنامه
« پاسخ #13 : 12 امرداد 1388، 01:55 ب‌ظ »
نقل‌قول
فردا توضیح می دم Smiley

ممنون  ;)

آفلاین Hani

  • Full Member
  • *
  • ارسال: 147
    • وبلاگ شخصی هانی هاشمی
پاسخ به: اضافه کردن فایل jar در هنگام اجرا به برنامه
« پاسخ #14 : 16 امرداد 1388، 02:59 ب‌ظ »
با کمک  java.source.ir و Syamah  بالاخره پیدا کردم  ;)
با استفاده از کلاس URLClassLoader

import java.net.URL;
import java.net.URLClassLoader;
import java.net.JarURLConnection;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.InvocationTargetException;
import java.util.jar.Attributes;
import java.io.IOException;

/**
 * A class loader for loading jar files, both local and remote.
 */
class JarClassLoader extends URLClassLoader {
    private URL url;

    /**
     * Creates a new JarClassLoader for the specified url.
     *
     * @param url the url of the jar file
     */
    public JarClassLoader(URL url) {
        super(new URL[] { url });
        this.url = url;
    }

    /**
     * Returns the name of the jar file main class, or null if
     * no "Main-Class" manifest attributes was defined.
     */
    public String getMainClassName() throws IOException {
        URL u = new URL("jar", "", url + "!/");
        JarURLConnection uc = (JarURLConnection)u.openConnection();
        Attributes attr = uc.getMainAttributes();
        return attr != null ? attr.getValue(Attributes.Name.MAIN_CLASS) : null;
    }

    /**
     * Invokes the application in this jar file given the name of the
     * main class and an array of arguments. The class must define a
     * static method "main" which takes an array of String arguemtns
     * and is of return type "void".
     *
     * @param name the name of the main class
     * @param args the arguments for the application
     * @exception ClassNotFoundException if the specified class could not
     *            be found
     * @exception NoSuchMethodException if the specified class does not
     *            contain a "main" method
     * @exception InvocationTargetException if the application raised an
     *            exception
     */
    public void invokeClass(String name, String[] args)
        throws ClassNotFoundException,
               NoSuchMethodException,
               InvocationTargetException
    {
        Class c = loadClass(name);
        Method m = c.getMethod("main", new Class[] { args.getClass() });
        m.setAccessible(true);
        int mods = m.getModifiers();
        if (m.getReturnType() != void.class || !Modifier.isStatic(mods) ||
            !Modifier.isPublic(mods)) {
            throw new NoSuchMethodException("main");
        }
        try {
            m.invoke(null, new Object[] { args });
        } catch (IllegalAccessException e) {
            // This should not happen, as we have disabled access checks
        }
    }

}

import java.io.IOException;
import java.net.URL;
import java.net.MalformedURLException;
import java.lang.reflect.InvocationTargetException;

/**
 * Runs a jar application from any url. Usage is 'java JarRunner url [args..]'
 * where url is the url of the jar file and args is optional arguments to
 * be passed to the application's main method.
 */
public class JarRunner {
    public static void main(String[] args) {
        if (args.length < 1) {
            usage();
        }
        URL url = null;
        try {
            url = new URL(args[0]);
        } catch (MalformedURLException e) {
            fatal("Invalid URL: " + args[0]);
        }
        // Create the class loader for the application jar file
        JarClassLoader cl = new JarClassLoader(url);
        // Get the application's main class name
        String name = null;
        try {
            name = cl.getMainClassName();
        } catch (IOException e) {
            System.err.println("I/O error while loading JAR file:");
            e.printStackTrace();
            System.exit(1);
        }
        if (name == null) {
            fatal("Specified jar file does not contain a 'Main-Class'" +
                  " manifest attribute");
        }
        // Get arguments for the application
        String[] newArgs = new String[args.length - 1];
        System.arraycopy(args, 1, newArgs, 0, newArgs.length);
        // Invoke application's main class
        try {
            cl.invokeClass(name, newArgs);
        } catch (ClassNotFoundException e) {
            fatal("Class not found: " + name);
        } catch (NoSuchMethodException e) {
            fatal("Class does not define a 'main' method: " + name);
        } catch (InvocationTargetException e) {
            e.getTargetException().printStackTrace();
            System.exit(1);
        }
    }