لماذا لا يريد تطبيق Spring Boot الخاص بك الاستماع على المنفذ 8080؟
\nتقوم بتشغيل أول تطبيق Spring Boot لك، وترى الشعار المرغوب في وحدة التحكم، وتفتح المتصفح - وتجد "Connection refused". موقف مألوف؟ غالبًا ما تكون المشكلة أن المنفذ 8080 مشغول بالفعل بعملية أخرى (مثل Skype أو Docker أو نسخة أخرى من تطبيقك نفسه). أو على العكس، تحتاج إلى تشغيل ثلاث خدمات مصغرة على جهاز واحد، وجميعها تريد الاستيلاء على نفس المنفذ.
\nفي هذه المقالة، سنستعرض جميع الطرق الرئيسية لتكوين المنفذ في Spring Boot - من الأبسط إلى طرق "الإنتاج" الفعلية. ستتعلم كيفية تجاوز المنفذ من خلال ملفات التكوين، ومتغيرات البيئة، ووسائط سطر الأوامر، وحتى برمجيًا. وفي النهاية، سأقدم لك قائمة مرجعية لاختيار الطريقة المناسبة حسب الموقف.
\n\nالطريقة 1: application.properties - الطريقة الكلاسيكية
\nالطريقة الأكثر شيوعًا وبديهية. في الملف src/main/resources/application.properties، يكفي إضافة سطر واحد:
server.port=9090\nهذا كل شيء. بعد إعادة التشغيل، سوف يستمع التطبيق على المنفذ 9090. إذا كنت بحاجة إلى العودة إلى 8080، فما عليك سوى حذف السطر أو تعليقه.
\nالمزايا: البساطة، الوضوح، يعمل "مباشرة من الصندوق".
\nالعيوب: مثبت بشكل ثابت في الكود - لكل بيئة (dev، test، prod) ستحتاج إلى تغيير الملف يدويًا أو استخدام الملفات الشخصية (profiles).
\n\nالطريقة 2: application.yml (YAML) - لعشاق التنظيم
\nإذا كنت تفضل تنسيق YAML، فسيكون التكوين على النحو التالي:
\nserver:\n port: 9090\nلاحظ المسافات البادئة: مسافتان قبل port. YAML حساس للمسافات، لكنه يسمح بتجميع الإعدادات. على سبيل المثال، يمكنك تعيين كل من المنفذ ومسار السياق معًا:
server:\n port: 9090\n servlet:\n context-path: /myapp\nمتى تستخدم: إذا كان مشروعك يستخدم بالفعل YAML لجميع التكوينات (على سبيل المثال، لـ Spring Cloud Config).
\n\nالطريقة 3: وسائط سطر الأوامر - المرونة لـ DevOps
\nالطريقة الأكثر مرونة، والتي تُستخدم غالبًا في الحاويات و CI/CD. عند تشغيل ملف JAR، ما عليك سوى تمرير المعامل:
\njava -jar myapp.jar --server.port=9090\nأو، إذا كنت تستخدم إضافة Maven/Gradle:
\nmvn spring-boot:run -Dspring-boot.run.arguments=--server.port=9090\nوسائط سطر الأوامر لها أعلى أولوية بين جميع طرق التكوين في Spring Boot. هذا يعني أنها ستتجاوز حتى ما هو مكتوب في application.properties.
مثالي لـ: حاويات Docker، Kubernetes، عمليات النشر الآلي.
\n\nالطريقة 4: متغيرات البيئة - معيار تطبيقات العوامل الاثني عشر
\nيقرأ Spring Boot متغيرات البيئة تلقائيًا ويحولها إلى خصائص. القاعدة بسيطة: SERVER_PORT (بأحرف كبيرة، شرطة سفلية بدلاً من النقطة) ستصبح server.port.
في Linux/macOS:
\nexport SERVER_PORT=9090\njava -jar myapp.jar\nفي Windows (cmd):
\nset SERVER_PORT=9090\njava -jar myapp.jar\nفي Docker Compose، يبدو هذا أكثر أناقة:
\nservices:\n myapp:\n image: myapp:latest\n ports:\n - "9090:9090"\n environment:\n - SERVER_PORT=9090\nلماذا هذا رائع: متغيرات البيئة لا تدخل إلى المستودع، ويسهل تغييرها لبيئات مختلفة، وتتبع منهجية تطبيق العوامل الاثني عشر (12-factor app).
\n\nالطريقة 5: التكوين البرمجي - للإدارة الدقيقة
\nأحيانًا تحتاج إلى حساب المنفذ ديناميكيًا (على سبيل المثال، العثور على منفذ متاح أو الحصول عليه من خدمة خارجية). هنا يأتي دور كود Java.
\nأبسط خيار هو تجاوز طريقة setServerPort في الكلاس