ایجاد پروژه 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] ------------------------------------------------------------------------
...



