انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: علی قنواتیان در 20 آبان 1388، 12:22 قظ
-
سلام؛
مدتیه با جاوا کار میکنم راستش توی اوبونتو ۹.۰۴ از eclipse استفاده میکنم و همه چیز به نظر خوبه ::)؛
مشکلی که هست اینه که وقتی یک کتابخانه jar رو توی کلاسم میگذارم توی محیط توسعه eclipse معرفیش میکنم و همه چیز به خوبی پیش میره ولی وقتی همون کلاس رو با استفاده از جاوا میخوام اجرا کنم این خطای مسخره رو میده:
ali-gh@blackStar:~/workspace/org.eclipse.swt$ java HellowWorldSWT
Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Display
at HellowWorldSWT.main(HellowWorldSWT.java:13)
Caused by: java.lang.ClassNotFoundException: org.eclipse.swt.widgets.Display
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 1 more
سوء تفاهم نشه، سورسش کاملا روشنه و توی اکلیپس بدون هیچ مشکلی اجرا میشه.
در مورد CLASSPATH هم باید بگم، مشکلی نباید وجود داشته باشه چون برنامههای سادهای مثل helloWorld به خوبی اجرا میشن.
در مورد کتابخانه، محل ذخیره شدنش همون جایی هستش که این کلاس ذخیره شده و قاعدتا در این مورد نباید مسئلهای وجود داشته باشه
ali-gh@blackStar:~/workspace/org.eclipse.swt$ ls
about_files HellowWorldSWT.class src.zip swt.jar
about.html HellowWorldSWT.java swt-debug.jar
من این راه رو هم امتحان کردم:
ali-gh@blackStar:~/workspace/org.eclipse.swt$ java -cp /usr/lib/jvm/java-6-sun-1.6.0.16/lib/:./swt.jar HellowWorldSWT
Exception in thread "main" java.lang.NoClassDefFoundError: HellowWorldSWT
Caused by: java.lang.ClassNotFoundException: HellowWorldSWT
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
Could not find the main class: HellowWorldSWT. Program will exit.
ممنون از توجهتون.
-
خیلی خب خودم راهش رو پیدا کردم \\:D/
واسه اینکه یک خورده این تالار به درد بخور بشه این رو داشته باشین:
همونطور که میشد حدس زد، اشکال از classpath بوده و دقیقتر بگم چون دو تا کتابخانه در این برنامه استفاده شده، نیاز است که هم کتابخانه اصلی J2SE و هم کتابخانهی متعلق به org.eclipse.swt در classpath معرفی شوند. این قضیه به خوبی از خروجی برنامه جاوا در ترمینال قابل مشاهده است.
اما راهکار:
در واقع راه حل بسیار آسانی وجود دارد که برای توسعه گرانی که میخواهند برنامهشان را روی سیستم دیگری (مثلا یک سرور) اجرا کنند بسیار مفید است. در این راهکار کتابخانه/کتابخانههای اضافیای که در برنامه استفاده شدهاند به محل کتابخانههای اضافی jvm منتقل میشوند. به این ترتیب، صرفنظر از اینکه برنامه از کدام مسیر اجرا شود، جاوا همیشه میتواند از کتابخانههای اضافی موجود استفاده کند.
و بالاخره:
کتابخانهها میبایست در مسیر lib/ext در مسیر JRE کپی شوند. (نیازی به ویرایش هیچ فایل دیگری نیست.)
اگر هنوز نمیدانید JRE کجای سیستم سکونت گزیده است! میتوانید به کمک دو دستور زیر محیط اجرای جاوا را پیدا و رهگیری کنید:
which java
ls -l OUTPUT_OF_ABOVE_COMMAND
در خروجی دستور اولی احتمالا usr/bin/java/ را خواهید گرفت که در واقع یک لینک است. در دستور دوم مشخص میشود که این لینک به کجا متصل شده است. (معمولا چندین مرحله لینک تا رسیدن به محل اصلی JRE باید طی شود)
به عنوان مثال در اوبونتو خرگوش دندان دراز من، جاوا در مسیر
/usr/lib/jvm/java-6-sun-1.6.0.16/
وجود داشت.
راستی این هم منبع:
http://java.sun.com/j2ee/verified/packaging.html