CLASSPATH، وJava Buld Path (Eclipse)، وWEB-INF\LIB:ماذا تستخدم ومتى ولماذا؟

StackOverflow https://stackoverflow.com/questions/1821571

سؤال

لقد قمت مؤخرًا بالتبديل إلى J2EE من .NET، وأنا في حيرة من أمري بشأن مكان وضع ملفات JAR.أعلم أن CLASSPATH وWEB-INF وJava Web Path الخاص بـ Eclipse كلها أماكن يمكن تخزين ملفات JAR فيها، لكنني في حيرة من أمري بشأن المجلد الذي يجب استخدامه ومتى ولماذا.

أولا، لدينا CLASSPATH.عادة ما أقوم بتعيين هذا عن طريق الانتقال إلى "متغيرات البيئة" داخل "جهاز الكمبيوتر". أعلم أن هذا هو المكان الافتراضي حيث يبحث مترجم Java عن ملفات JAR.عندما أقوم بإضافة مجلد أو JAR إلى متغير بيئة CLASSPATH الخاص بي، لماذا يتم تجاهله بواسطة Eclipse ومترجم Java وخادم الويب؟

أعلم أيضًا أن WEB-INF\LIB هو مكان يمكنك من خلاله وضع ملفات JAR التي سيستخدمها تطبيق الويب الخاص بك.ومع ذلك، فقد قمت بوضع ملفات JAR في WEB-INF\LIB فقط ليتم تجاهلها.في أي المواقف يجب أن أضع ملفات JAR في مجلد WEB-INF\LIB؟كيف يمكنني أن أجعل Eclipse أو خادم الويب يلاحظهم؟

حتى الآن، الشيء الوحيد الذي يناسبني هو تغيير Java Build Path لمشروع Eclipse.سأختار JARs التي أحتاجها وأضغط على "إضافة JARs خارجية". في معظم الأوقات عندما أفعل ذلك ، سيتعرف Eclipse على JARs الخاصة بي ويقرأ الفصول الدراسية فيها.ومع ذلك، فقد واجهت مجموعة من الأخطاء العشوائية الغريبة أثناء القيام بذلك (أعتقد أن معظمها يتعلق بالتبعيات).لسبب ما، أشعر أن هذه ليست الطريقة الصحيحة لفعل الأشياء، وأنني أفتقد بعض المعلومات الحيوية.متى يجب أن أقوم بإضافة ملفات JAR خارجية يدويًا داخل Eclipse، ومتى يجب أن أفعل الأشياء بشكل مختلف؟كيف يبدو أن Java Build Path الخاص بـ Eclipse لا يعرف شيئًا عن المجلدات الموجودة في متغير بيئة CLASSPATH الخاص بي؟

حقًا، أود فقط الحصول على فهم أفضل لـ CLASSPATH، ومسار بناء Java الخاص بـ Eclipse، ومجلد WEB-INF/LIB - الأغراض التي تخدمها، والعلاقات بينها، والمكان الذي يجب أن أضع فيه ملفات JAR الخاصة بي في مختلف مواقف.سأكون ممتنًا لأي نصيحة يمكنك تقديمها لي، أو أي مقالات يمكنك التوصية بها.

شكرًا لك.

هل كانت مفيدة؟

المحلول

ووCLASSPATH تعيين في البيئة الخاصة بك يؤثر فقط على تطبيقات جافا بذاتها، أي تلك التي يتم تشغيلها من موجه الأوامر أو رمز. كما كنت قد لاحظت، والكسوف يتجاهل هذا. أنه يضع لها classpaths الخاصة لكل مشروع.

وjavac وjava، إذا طلبت من موجه الأوامر، يجب / قد شرف هذا الطريق، إلا أنها لم تعد تعتبر ممارسة رائعة للقيام بذلك. لقد اتضح أن كل التطبيق يحتاج مجموعتها الخاصة من الاشياء، لذلك CLASSPATH العالمي لا يفعل حقا أي منهم أي خير. الممارسة الحديثة هو ببساطة تحديد CLASSPATH مع خيار -cp على سطر الأوامر لjavac أو java.

وسيتم تعيين خادم تطبيق ويب مستقل أيضا CLASSPATH الخاص بها. من سطر الأوامر أو واجهة المستخدم الرسومية، والتي WebAppServers عادة السيناريو (.BAT أو .sh) أن يضع CLASSPATH باستخدام -cp. القط لديه دليل يسمى common أو common/lib حيث يتوقع أن يرى المكتبات التي يجب أن تكون متاحة للخادم وجميع برامج تشغيل تحته. ولكن سوف عموما لا تحتاج / تريد الفوضى مع هذا، كما انها customaries للتطبيقات لتوفير collectons مكتبة خاصة بهم في WEB-INF/lib.

وهكذا على التطبيق ويب، وكنت وضعت الجرار varous بك إلى الدليل lib، تحت WEB-INF، على افتراض الكسوف قبل يبني مثل هذا بنية الدليل بالنسبة لك.

جميع يبس تحتاج أيضا يجب القيام بها معروفة للكسوف. في مستكشف المشاريع، وتحديد مجموعة كاملة منها في آن واحد، انقر بزر الماوس الأيمن واختر Build Path | add to build path. وهذا أسهل من العبث مع مسار بناء مشروع الكسوف يدويا.

نصائح أخرى

تتمتع Java بتاريخ طويل وقد أظهرت التجربة أن بعض الأفكار كانت جيدة وبعضها الآخر كان سيئًا.

كان متغير البيئة CLASSPATH هو الطريقة الأولية لإخبار جهاز Java بمكان تحديد الفئات من برنامجك، ويعمل بشكل جيد مع برامج سطر الأوامر.وسرعان ما تبين أن هذا لا ينبغي أن يكون شيئًا عالميًا (لأن ذلك يؤدي إلى إفساد الأمور على المدى الطويل) بل يجب أن يكون شيئًا خاصًا بكل برنامج.يمكن القيام بذلك عن طريق إنشاء برنامج نصي مجمّع/ملف BAT يقوم بتعيين المتغير وتشغيل جهاز Java.

كان كل شيء على ما يرام، ثم أراد الناس كتابة عناصر خادم الويب بلغة Java.تم إنشاء Servlet API حيث يكون تطبيق الويب عبارة عن وحدة قائمة بذاتها - مما أدى إلى إنشاء CLASSPATH لـ كل تطبيق الويب يكون الملفات التي تم فك حزمتها ضمن WEB-INF/classes بالإضافة إلى ملفات jar ضمن WEB-INF/lib.وهذا فقط.وهذا يعني أنه تم تجاهل المتغير CLASSPATH العمومي.وقد وجد أن هذا هو جداً شيء جيد، لذلك انتقل المفهوم إلى مكان آخر.

على سبيل المثال، تحتوي "جرة قابلة للتنفيذ" (والتي يطلق عليها Eclipse "جرة قابلة للتشغيل") والتي يتم استدعاؤها باستخدام "java -jar foobar.jar" على مسار الفصل الكامل داخل الجرة في ملف بيان خاص.Java Web Start الذي يُستخدم لبدء برامج Java من خادم ويب يسرد بوضوح مسار الفئة الكامل في ملف التكوين على الخادم.

ولكن، لتبدأ.إذا كنت تريد كتابة تطبيق ويب Java:

  1. احصل على الكسوف جافا إي إصدار.
  2. قم بإنشاء مشروع ويب ديناميكي جديد على سبيل المثال.اسمه فوبار.
  3. قم بسحب وإسقاط (أو نسخ/لصق) ملفات الجرة التي تحتاجها في foobar/WebContent/WEB-INF/lib
  4. أنشئ ملفًا جديدًا باسم foobar/WebContent/index.jsp.في نوع الملف الفارغ <h1>Hello World <%= new java.util.Date() %></h1>
  5. انقر بزر الماوس الأيمن في محرر ملف Index.jsp، واختر تشغيل -> تشغيل على الخادم، واختر معاينة Basic -> J2EE على خادم المضيف المحلي، ثم إنهاء.

سيتم الآن فتح نافذة متصفح، إما في المتصفح أو داخل Eclipse والتي ستعرض صفحة JSP الخاصة بك.يمكنك تغيير صفحة JSP وحفظها باستخدام Ctrl-S وإعادة تحميل نافذة المتصفح لرؤية التغييرات.

أعلم أيضًا أن WEB-INF\LIB هو مكان يمكنك من خلاله وضع ملفات JAR التي سيستخدمها تطبيق الويب الخاص بك.ومع ذلك، فقد قمت بوضع ملفات JAR في WEB-INF\LIB فقط ليتم تجاهلها.في أي المواقف يجب أن أضع ملفات JAR في مجلد WEB-INF\LIB؟كيف يمكنني أن أجعل Eclipse أو خادم الويب يلاحظهم؟

ال حقيقي المشكلة التي تواجهها هنا من المحتمل أنك لم تواجهها الكسوف لجافا إي المطورين و/أو أنك قمت للتو بإنشاء ملف عام مشروع جافا بدل من مشروع الويب الديناميكي وقم ببناء بنية المجلد الضرورية بنفسك.

إذا قمت بإنشاء مشروع الويب الديناميكي في Eclipse لمطوري Java EE, ، فسيقوم Eclipse تلقائيًا بإضافة أي مكتبات فيه WEB-INF/lib إلى مسار بناء.ال مسار بناء يُقال تقريبًا فقط مسار الفصل الذي يتم استخدامه في كل من وقت الترجمة ووقت التشغيل.وبكلمات أخرى:ما عليك سوى إسقاط ملفات JAR الخاصة بالطرف الثالث هناك، ولا يلزمك فعل أي شيء آخر.

لاحظ أن Java حساسة لحالة الأحرف، وبالتالي يجب أن يتم استدعاؤها بالفعل WEB-INF/lib, ، لا WEB-INF/LIB.ولكن على أية حال، إذا قمت بإنشاء ملف مشروع الويب الديناميكي, ، سيقوم Eclipse تلقائيًا بإنشاء بنية المجلد/الملف الصحيحة لك.

كما قال الآخرون، تجاهل %CLASSPATH% متغيرات البيئة.إنها فقط يستخدمه javac.exe/Java.exe وحتى ذلك الحين فقط عندما تفعل لا تحديد أي من -cp, -classpath أو -jar الحجج.في العالم الحقيقي، نادرًا ما يتم استخدام متغير البيئة هذا، فهو مجرد وسيلة راحة للمبتدئين (ولسوء الحظ أيضًا الأكثر إرباكًا، لم يكن عليهم اختراعه أبدًا).

إذا كنت تتعامل مع تطبيقات الويب، / WEB-INF / ليب هو المكان المحمولة لوضع الجرار. هذا هو المكان <الصورة> خوادم الشبكة حاويات بريمج تتوقع العثور ملفات جرة أحد التطبيقات.

والكسوف يتطلب منك تحديد المسار إلى المكتبات، وملفات جرة (على خصائص -> جافا بناء مسار -> علامة التبويب المكتبات). يمكن العثور على هذا على ملف المشروع .classpath.

وعادة لديك ليبس JRE في طريقها (والتي ستكون على CLASSPATH الخاص بك أيضا)، بحيث إضافة يبس إلى classpath وتحديثها أن الكسوف بناء مسار العمل.

ويجب أن يكون الدليل WEB-INF المكان الذي يحتوي على المعلومات اللازمة لتطبيق الويب الخاص بك.

وأنا لست خبيرا الكسوف، ولكن أعتقد أن مشكلتك يمكن الرد على مثل هذا:

1) CLASSPATH هو متغير البيئة التي يتم قراءتها في عند إطلاق برامج جافا ويستخدم من قبل classloader لمعرفة أين توضع الطبقات.

وأود أن تعديل متغير CLASSPATH فقط في حالة عند إطلاق برنامج جافا من السيناريو، وهذا يسمح لك لبدء مريح برنامج وتأكد من أن يتم العثور على الطبقات. وهذا لن يكون هذا هو الحال بالنسبة لك، كما انك تطوير تطبيقات الويب.

2) WEB-INF / ليب هو الدليل الذي تحت classloader الحاوية تطبيق الويب (مثل هر أو glassfish) يبدو في حالة وجود تطبيق الويب الخاص بك يحتاج إلى حل فئة. لذلك كنت وضعت هناك الفئات التي تستخدم في تطبيق الويب الخاص بك.

وتقوم بعض IDE تفعل تشمل المكتبات / ملفات جرة الذي تستخدمه في مشروع تلقائيا إلى الحزمة.

و3) مكتبة الكسوف / CLASSPATH حل خلال الوقت اللازم لتطوير. وأود أن نفترض، ولكن الاعتذار عن افتراض، باعتبارها واحدة حقا لا ينبغي أن يفعل ذلك؛)، والتي يمكنك تحديد مكتبة (إضافة ملفات جرة الخارجية للمشاريع) ويجب الإكمال التلقائي / جميع الميزات الأخرى المثيرة للاهتمام بدء العمل مع هذا، كما كنت في الأساس جعل تلك الطبقات لIDE مع أن النشاط مرئية. وأود أيضا أن نفترض أنه يمكنك ثم وضع علامة هذه المكتبات إلى أن تضاف تلقائيا إلى مشاريع على شبكة الإنترنت وما إلى ذلك، من قبل IDE.

في عام قراءة جيدة حول كيفية الطبقات وجدت أثناء التنفيذ هو <وأ href = "http://java.sun.com/j2se/1.4.2/docs/tooldocs/findingclasses.html" يختلط = "نوفولو noreferrer "> هنا (انها وثائق رسمية من الشمس). أيضا مكان جيد للقراءة عن هذا هو وثائق من الدرجة ClassLoader.

ومجتمعة التعليقات ساعدتني أيضا. كنت قد وأضاف كل .jars جينا لمسار بناء من كسوف لكن ذلك لم يكن كافيا. وبعد اقتراح "إضافة إلى WEB-INF / ليب" يبدو بديهية لسحب من مجلد المكتبات لWEB-INF (من داخل الكسوف)، ولكن ذلك لم ينجح. ولم نسخ .jars إلى WEB-INF. أنا في نهاية المطاف سحب وإسقاط-من سطح المكتب ويندوز إلى المجلد ليب-WEB الوقود النووي المشع في الكسوف، وأن المشكلة الثابتة. سيكون من الجميل لو تم نسخ أي .jars تضاف إلى مسار بناء تلقائيا إلى ليب WEB-INF قبل الكسوف. في حال لا يهم، وكان هذا الكسوف IDE EE، وإطلاق سراح نيلي، على ويندوز 7.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top