ایجاد پروژه maven با امکانات متمایز از وابستگی ها

در محل کار ما با Graalvm مشکلی داشتیم و به همین دلیل این مسئله ایجاد شد.
من با نویسنده صحبت کردم و فکر کردم “آیا بهتر نیست با آن ناز یک پروژه Maven ایجاد کنیم؟ با یک repo ، MCVE ، که شما از طریق پروفایل وابستگی ها را کنترل می کنید؟”
و اینجا repo است! github.com/jeffque/graalvm-regression
خوب ، لذت ببرید که من این کار را انجام خواهم داد و روند را کمی به اشتراک می گذارم.
شروع یک پروژه Maven
برای مبتدیان ، من دوست دارم پروژه Maven را شروع کنم mvnw
(بسته بندی Maven). من معمولاً با کپی کردن شروع می کنم mvnw
از یک مخزن دیگر شناخته شده من ، اما من می توانم این کار را به صورت متعارف انجام دهم. به عنوان مثال ، به دنبال این آموزش Baeldung:
$ mvn -N wrapper:wrapper
بنابراین دایرکتوری بود:
.
├── .mvn
│ └── wrapper
│ └── maven-wrapper.properties
├── mvnw
└── mvnw.cmd
از چه نسخه ای از Maven استفاده می کند؟ ما ممکن است مستقیماً بخواهیم mvwn
یا مشورت کنید .mvn/wrapper/maven-wrapper.properties
بشر در این حالت ، محتوای پرونده:
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip
خیلی خوب ، Maven در نسخه 3.9.9 ، لذت بخش است.
ایجاد پروژه پایه
روش های مختلفی برای شروع یک پروژه Maven وجود دارد. از جمله شما
ای pom.xml
کاملاً از ابتدا اما … یک روش متعارف تر این است که درخواست کنید
Archetype ، من حتی در “سلام ، جهان!” در GWT با استفاده از Tbrayer Archetype.
بنابراین ، بیایید آرکیپت خالی را سفارش دهیم؟ معمولاً می خواهم maven-archetype-quickstart
بشر این لیست در اینجا دارای لیست غیر اکسپیوری از Archetypes است.
./mvnw archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.5
پس از بارگیری امکانات مورد نیاز برای اجرای آرکتیپ ، او از من می پرسد:
- ارزش را برای املاک 'groupid' تعریف کنید
- ارزش را برای املاک 'artifactid' تعریف کنید
- GRAALVM-24-1-2- رگرسیون
- مقدار برای ویژگی “نسخه” 1.0-snpashot را تعریف کنید
(آنچه معادل استفاده از پیش فرض است ، که در این حالت این است 1.0-SNAPSHOT
)
- تعریف ارزش برای ملک 'بسته' com.jeffque:
(آنچه معادل استفاده از پیش فرض است ، که در این حالت این است com.jeffque
)
پس از پاسخ دادن ، وی می خواهد تأیید کند:
Define value for property 'package' com.jeffque:
Confirm properties configuration:
javaCompilerVersion: 17
junitVersion: 5.11.0
groupId: com.jeffque
artifactId: graalvm-24-1-2-regression
version: 1.0-SNAPSHOT
package: com.jeffque
Y:
Confime است … پف!
.
├── .mvn
│ └── wrapper
│ └── maven-wrapper.properties
├── graalvm-24-1-2-regression
│ ├── .mvn
│ │ ├── jvm.config
│ │ └── maven.config
│ ├── pom.xml
│ └── src
│ ├── main
│ │ └── java
│ │ └── com
│ │ └── jeffque
│ │ └── App.java
│ └── test
│ └── java
│ └── com
│ └── jeffque
│ └── AppTest.java
├── mvnw
└── mvnw.cmd
آیا من در گوشه اشتباه تولید کردم؟ خوب ، فقط یک پوشه را در آنجا حرکت دهید
بشر
cd graalvm-24-1-2-regression
mv pom.xml src ../
mv .mvn/* ../.mvn
rmdir .mvn
cd ..
rmdir graalvm-24-1-2-regression
خوب ، مجموعه:
.
├── .mvn
│ ├── jvm.config
│ ├── maven.config
│ └── wrapper
│ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
├── main
│ └── java
│ └── com
│ └── jeffque
│ └── App.java
└── test
└── java
└── com
└── jeffque
└── AppTest.java
اضافه کردن دستور اجرای
من می خواهم زندگی را برای کسانی که با استفاده از Maven آزمایش می کنند آسانتر کنم. برای این کار ، افزونه را پیکربندی می کنم exec
بشر افزونه این است: exec-maven-plugin
بشر
در خط فرمان:
> ./mvnw exec:java -Dexec.mainClass="com.jeffque.App"
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------< com.jeffque:graalvm-24-1-2-regression >----------------
[INFO] Building graalvm-24-1-2-regression 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- exec:3.5.0:java (default-cli) @ graalvm-24-1-2-regression ---
Hello World!
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.383 s
[INFO] Finished at: 2025-01-31T08:02:13-03:00
[INFO] ------------------------------------------------------------------------
زیبایی ، بیایید به پوم برویم؟ در pluginManagement
ما نشان می دهیم که این افزونه هنگام فراخوانی اجرا می شود ، لزوماً نامیده نمی شود. بنابراین اگر من اضافه کنم exec-maven-plugin
در آنجا ، Maven سعی نخواهد کرد که واکشی از این افزونه پیشینی را بسازد. در حال حاضر build.plugins
… سپس ما نشان می دهیم که این افزونه واقعاً انجام خواهد شد.
در اینجا این سؤال مطرح می شود: چه موقع از چیزی استفاده کنید build.plugins
؟ هنگامی که ما به پلاگین نیاز داریم تا اجرا شود و در جایی ضمنی ندارد. مانند تماس retrolambda
به شما امکان می دهد از نحو لامبدا استفاده کنید و قادر به دادن جاوا 7 باشید.
خوب ، بیایید تنظیمات افزونه را در آن اضافه کنیم pluginManagement
؟ ابتدا بیایید افزونه را در آنجا قرار دهیم:
org.codehaus.mojo
exec-maven-plugin
3.5.0
خوب ، ما نسخه را نگه داریم. حالا ، بیایید به آنچه گفته می شود برویم. در این حالت ، هنگامی که mojo نامیده می شود exec:java
: exec
پلاگین Ese را شناسایی کنید java
ای هدف خاص:
org.codehaus.mojo
exec-maven-plugin
3.5.0
java
خوب ، اکنون ، بیایید به پیکربندی کلاس اصلی برویم:
org.codehaus.mojo
exec-maven-plugin
3.5.0
...
com.jeffque.App
افزونه پیکربندی شده! خواهد بود؟
> ./mvnw exec:java
[INFO] Scanning for projects...
[INFO]
[INFO] ---------------< com.jeffque:graalvm-24-1-2-regression >----------------
[INFO] Building graalvm-24-1-2-regression 1.0-SNAPSHOT
[INFO] from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- exec:3.5.0:java (default-cli) @ graalvm-24-1-2-regression ---
Hello World!
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.341 s
[INFO] Finished at: 2025-01-31T08:28:48-03:00
[INFO] ------------------------------------------------------------------------
تطبیق با مسئله مسئله
بیایید همه چیز را از مسئله Github بگذاریم. اول ، برای نسخه مشکل ساز Graalvm. بیایید تغییر دهیم main
تأمل کنید همانطور که در حال مسئله است.
محل را اضافه کرده و تغییر دهید main
این یک غیر اسو بود ، کاملاً مستقیم. برای آزمایش ، من محل را برای نسخه GraalVM با مشکل قرار دادم و برای شما ارسال کردم:
> ./mvnw compile exec:java
...
org.graalvm.polyglot.PolyglotException: TypeError: k.equals is not a function
at .:=> (Unnamed:6)
at com.oracle.truffle.polyglot.PolyglotFunctionProxyHandler.invoke (PolyglotFunctionProxyHandler.java:151)
...
عالی! همانطور که در این مسئله ظاهر می شود!
مشخصات
من پروفایل های مختلفی ایجاد خواهم کرد. و در آنها امکانات را قرار می دهم. می توانید اطلاعات بیشتری را در مستندات رسمی بخوانید.
من دو پروفایل ایجاد خواهم کرد:
- Graalvm-24 ، مشکل را ارائه می دهد
- graalvm-20 ، مشکل را ارائه نمی دهد
graalvm-24
graalvm-24
خوب. graalvm-24
به طور پیش فرض فعال است. اگر کسی چیزی نگوید ، از او استفاده می شود:
graalvm-24
true
چگونه می توان از این پروفایل استفاده کرد؟ عبور از گزینه -P
در خط فرمان!
به عنوان مثال:
./mvnw exec:java -Pgraalvm-24
من توضیح می دهم که نمایه را می خواهم graalvm-24
بشر به همین ترتیب:
./mvnw exec:java -Pgraalvm-20
برای نمایه graalvm-20
بشر من می توانم چندین پروفایل را نیز منتقل کنم:
./mvnw exec:java -Pgraalvm-20,jeff,marmota
این پروفایل ها را فعال می کند graalvm-20
با jeff
اشمیه marmota
بشر و در این حالت activateByDefault
، چگونه کار می کند؟ خوب ، اگر چیزی نگویید …
./mvnw exec:java
# note que não tem -P
فقط آنچه را که به طور پیش فرض ثبت شده است فعال می کند.
خیلی خوب ، اکنون محل را قرار داده ام:
graalvm-24
true
org.graalvm.polyglot
polyglot
24.1.2
org.graalvm.polyglot
js-community
24.1.2
pom
runtime
graalvm-20
org.graalvm.sdk
graal-sdk
20.1.0
org.graalvm.js
js
20.1.0
و همین است ، اکنون من دو پروفایل مجزا دارم! توجه داشته باشید که graalvm
از آنجا خارج شد project.dependencies
، زیرا این وابستگی ها بدون مشخصات بر همه تأثیر می گذارد.
برای آزمون:
> ./mvnw exec:java
...
org.graalvm.polyglot.PolyglotException: TypeError: k.equals is not a function
at .:=> (Unnamed:6)
...
> ./mvnw exec:java -P graalvm-20
...
[INFO] --- exec:3.5.0:java (default-cli) @ graalvm-24-1-2-regression ---
Optional[true]
[INFO] ------------------------------------------------------------------------
...