برنامه نویسی

ایجاد پروژه 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] ------------------------------------------------------------------------
...
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا