مشروع Maven Multi-Moven و Jetty: Run
-
30-09-2019 - |
سؤال
أحاول تقسيم مشروع حرب Maven إلى وحدتين ، حتى أتمكن من إنشاء ملف JAR منفصل مع أدوات سطر الأوامر. النتيجة لها الهيكل التالي:
pom.xml
(العبوةpom
, ولديه وحدتان)project-jar/
pom.xml
(العبوةjar
)
project-war/
pom.xml
(العبوةwar
, ، يعتمد علىproject-jar
)
إذا ركضت mvn
أوامر من الجذر ، كل شيء يعمل بشكل جيد. أود الاستمرار في استخدام mvn jetty:run
, ، لكن لذلك ، أحتاج إلى تنفيذ الأمر في مشروع الحرب الفرعي. إذا فعلت ذلك ، فشك في العثور على project-jar
المشروع الفرعي ، لذلك لن يتم تشغيله. حتى mvn jetty:run-war
مع ملف حرب تم تجميعه بالكامل في target
فشل الدليل ، لأنه يحاول أولاً "بناء" المشروع. لقد تمكنت فقط من جعلها تعمل عن طريق التثبيت project-jar
في مستودع Maven المحلي ، وهو ليس لطيفًا جدًا.
هل هناك طريقة لاستخدام المكون الإضافي الرصيف في تكوين Maven متعدد الوحدات؟
المحلول
لا يوجد حل سحري والوحيد الذي أعرفه هو الاختراق بعض الشيء ويعتمد على extraClasspath
العنصر الذي يمكنك استخدامه لإعلان أدلة فئة إضافية نسبيًا. مثل هذا (من Jetty-662):
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>7.0.1.v20091125</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<webAppConfig>
<contextPath>/my-context</contextPath>
<extraClasspath>target/classes;../my-jar-dependency/target/classes</extraClasspath>
</webAppConfig>
<scanTargets>
<scanTarget>../my-jar-dependency/target/classes</scanTarget>
</scanTargets>
</configuration>
</plugin>
نصائح أخرى
قم بإنشاء ملف تعريف داخل وحدة الحرب (project-war
). ضمن هذا الملف الشخصي ، قم بتكوين الرصيف لترفع مرحلة دورة الحياة وتنفيذ run
الهدف بشكل صريح. الآن عندما يمتد Maven من مشروع Toplevel مع تمكين هذا الملف الشخصي ، فإنه سوف يستدعي Jetty: Run وابتعاد دقة التبعية للوحدة الشقيقة (كما هو معتاد عند تنفيذ أوامر Maven من مشروع Toplevel).
تكوين المثال ، عند وضعه في pom.xml من وحدة الويب (project-war
) ، يرتب لصالح الرصيف: الجري للتنفيذ خلال test
مرحلة. (يمكنك اختيار مرحلة أخرى ، ولكن تأكد من أنها بعد ذلك compile
.)
يركض من Toplevel: mvn test -Pjetty-run
أو mvn test -DskipTests=true -Pjetty-run
. سيؤدي ذلك إلى تجميع التبعيات كما هو مطلوب وجعلها متوفرة ولكن استدعاء رصيف: قم بتشغيل داخل الوحدة النمطية الصحيحة.
<profiles>
...
<!-- With this profile, jetty will run during the "test" phase -->
<profile>
<id>jetty-run</id>
<build>
<plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>7.1.6.v20100715</version>
<configuration>
...
<webAppSourceDirectory>
${project.build.directory}/${project.build.finalName}
</webAppSourceDirectory>
...
</configuration>
<executions>
<execution>
<id>jetty-run</id>
<phase>test</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
...
</profiles>
استخدام outsaclasspath في تكوين الرصيف يعمل ... ولكن لسبب ما ، إذا كانت الجرار التابعة (من الوحدات النمطية الأخرى) عفا عليها الزمن لن تعمل بعض الأشياء بشكل صحيح.
أضف المكون الإضافي رصيف إلى جذر POM وتكوين ContexThandler يشير إلى الحرب المطلوبة. هذا يعمل بالنسبة لي في مشروع مع وحدات جرة متعددة وحربين تراكب.
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.0.M2</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<contextHandlers>
<contextHandler
implementation="org.eclipse.jetty.maven.plugin.JettyWebAppContext">
<war>${project.basedir}/project-war/target/project-war-${project.version}.war</war>
<contextPath>/</contextPath>
</contextHandler>
</contextHandlers>
</configuration>
</plugin>
http://eclipse.org/jetty/documentation/current/jetty-maven-plugin.html#running-more-than-one-webapp
أعلم أنك تطلب تكوين البرنامج المساعد ، ولكن يمكنك فقط تحديد المشروع في أمر Maven:
$ mvn jetty:run --projects project-war