ম্যাভেনে জাভা সংস্করণ উল্লেখ করে - বৈশিষ্ট্য এবং সংকলক প্লাগইনের মধ্যে পার্থক্য


178

আমি ম্যাভেনের সাথে খুব অভিজ্ঞ নই এবং মাল্টি-মডিউল প্রকল্পের পরীক্ষার সময় আমি ভাবতে শুরু করেছিলাম যে আমি কীভাবে আমার সমস্ত শিশু মডিউলগুলির জন্য পিতামাতা মাভেন পোমে জাভা সংস্করণটি নির্দিষ্ট করতে পারি। আজ অবধি আমি ঠিক ব্যবহার করছিলাম:

<properties>
    <java.version>1.8</java.version>
</properties>

তবে গবেষণা করার সময় আমি দেখতে পেলাম যে আপনি ম্যাভেন সংকলক প্লাগইনে জাভা সংস্করণটিও নির্দিষ্ট করতে পারবেন:

<plugins>
    <plugin>    
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>
</plugins>

এবং তারপরে এটির চাইল্ড পুমস ব্যবহার সক্ষম করতে প্লাগইন পরিচালনার ট্যাগ এ মোড়ুন। সুতরাং প্রথম প্রশ্নটি হল বিটওয়েন বৈশিষ্ট্যগুলিতে এবং মাভেন সংকলক প্লাগইনে জাভা সংস্করণটি নির্ধারণ করে কী কী?

আমি পরিষ্কার উত্তর খুঁজে পাইনি তবে গবেষণার প্রক্রিয়ায় আমি জানতে পেরেছি যে আপনি এইভাবে জাভা সংস্করণটিও নির্দিষ্ট করতে পারেন:

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

যা প্রস্তাব দেয় যে সংকলক প্লাগইন সেখানে রয়েছে যদিও আমি স্পষ্টভাবে এটি ঘোষণা করি না। এমভিএন প্যাকেজ আউটপুট দিয়ে চলছে

maven-compiler-plugin:3.1:compile (default-compile) @ testproj ---

এবং কিছু অন্যান্য প্লাগইন যা আমি ঘোষণা করি নি। তাহলে কি এই প্লাগইনগুলি ডিফল্ট, ম্যাভেন পমের লুকানো অংশ? বৈশিষ্ট্যগুলিতে এবং মাভেন প্লাগইন কনফিগারেশন উপাদানগুলিতে বিটউইন সেটিং উত্স / টার্গেটের কোনও পার্থক্য রয়েছে কি?

আরও কিছু প্রশ্ন হ'ল - কোন উপায়ে ব্যবহার করা উচিত (এবং যখন তারা সমান না হয়)? মাল্টি-মডিউল প্রকল্পের জন্য কোনটি সেরা এবং যদি পম-এ বর্ণিত জাভা সংস্করণ জাভাআহোমে উল্লিখিত সংস্করণটির চেয়ে আলাদা হয় তবে কী ঘটে?

উত্তর:


289

জেডিকে সংস্করণটি কীভাবে নির্দিষ্ট করবেন?

1) <java.version>মাভেন ডকুমেন্টেশনে উল্লেখ করা হয়নি।
এটি একটি স্প্রিং বুট নির্দিষ্টতা।
এটি উভয়টির জন্য জাভা 1.8 নির্দিষ্ট করার জন্য এটির মতো একই সংস্করণ সহ উত্স এবং লক্ষ্য জাভা সংস্করণ সেট করতে দেয়:

<properties>
     <java.version>1.8</java.version>
</properties>   

আপনি যদি স্প্রিং বুট ব্যবহার করেন তবে নির্দ্বিধায় এটি ব্যবহার করুন।

2) ব্যবহার করতে maven-compiler-pluginবা maven.compiler.source/ maven.compiler.targetবৈশিষ্ট্যগুলি নির্দিষ্ট করতে sourceএবং targetএর সমতুল্য।

<plugins>
    <plugin>    
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>
</plugins>

এবং

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

সংকলক প্লাগইনের ম্যাভেন ডকুমেন্টেশন অনুসারে সমান <source>এবং যেহেতু <target>সংকলক কনফিগারেশনের উপাদানগুলি বৈশিষ্ট্যগুলি ব্যবহার করে maven.compiler.sourceএবং maven.compiler.targetযদি সেগুলি সংজ্ঞায়িত করা হয়।

উৎস

-sourceজাভা কম্পাইলার জন্য যুক্তি।
ডিফল্ট মান হল: 1.6
ব্যবহারকারী সম্পত্তি হল: maven.compiler.source

লক্ষ্য

-targetজাভা কম্পাইলার জন্য যুক্তি।
ডিফল্ট মান হল: 1.6
ব্যবহারকারী সম্পত্তি হল: maven.compiler.target

জন্য ডিফল্ট মান সম্পর্কে sourceএবং target, নোট যে যেহেতু 3.8.0ম্যাভেন কম্পাইলার, ডিফল্ট মান থেকে পরিবর্তিত হয়েছে 1.5থেকে1.6

3) মাভেন-সংকলক-প্লাগইন 3.6এবং পরবর্তী সংস্করণগুলি একটি নতুন উপায় সরবরাহ করে:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <release>9</release>
    </configuration>
</plugin>

আপনি ঠিক ঘোষণা করতে পারেন:

<properties>
    <maven.compiler.release>9</maven.compiler.release>
</properties>

তবে এই সময়টি এটি হিসাবে কাজ করবে না maven-compiler-plugin আপনি ডিফল্ট সংস্করণটি ব্যবহার করেন তা সাম্প্রতিক পর্যায়ে যথেষ্ট সংস্করণের উপর নির্ভর করে না।

মাভেন releaseআর্গুমেন্ট জানায় release: একটি নতুন জেভিএম স্ট্যান্ডার্ড বিকল্প যা আমরা জাভা 9 থেকে পাস করতে পারি:

নির্দিষ্ট ভিএম সংস্করণের জন্য সর্বজনীন, সমর্থিত এবং ডকুমেন্টেড এপিআইয়ের বিরুদ্ধে সংকলন করে।

এই উপায়টি source, targetএবং এবং bootstrapজেভিএম বিকল্পগুলির জন্য একই সংস্করণটি নির্দিষ্ট করার জন্য একটি মানক উপায় সরবরাহ করে ।
নোট করুন যে bootstrapক্রস সংকলনের জন্য উল্লেখ করা একটি ভাল অনুশীলন এবং আপনি যদি ক্রস সংকলন না করেন তবে এটির ক্ষতি হবে না।


জেডিকে সংস্করণ নির্দিষ্ট করার সর্বোত্তম উপায় কোনটি?

<java.version>আপনি যদি স্প্রিং বুট ব্যবহার করেন তবে প্রথম উপায় ( ) অনুমোদিত।

জাভা 8 এবং নীচের জন্য:

অন্য দুটি উপায় সম্পর্কে: maven.compiler.source/ maven.compiler.targetবৈশিষ্ট্যের মূল্যায়ন বা ব্যবহার করেmaven-compiler-plugin , আপনি একটি বা অন্যটি ব্যবহার করতে পারেন। শেষ পর্যন্ত দুটি সমাধান একই বৈশিষ্ট্য এবং একই প্রক্রিয়া: মাভেন কোর সংকলক প্লাগইন উপর নির্ভর করে যেহেতু এটি সত্যে কিছুই পরিবর্তন করে না।

ঠিক আছে, আপনার যদি সংকলক প্লাগইনে জাভা সংস্করণগুলির তুলনায় অন্য বৈশিষ্ট্য বা আচরণ নির্দিষ্ট করার প্রয়োজন না হয় তবে এই উপায়টি আরও সংক্ষিপ্ত বলে আরও বেশি অর্থবোধ করে:

<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

জাভা 9 থেকে:

releaseযুক্তি (তৃতীয় পয়েন্ট) একটি উপায় জোরালোভাবে বিবেচনা করতে আপনি উৎস এবং টার্গেট জন্য একই সংস্করণ ব্যবহার করতে চান হয়।

JAVA_HOME এর JDK এর মধ্যে সংস্করণ এবং pom.xML এ বর্ণিত কোনটির মধ্যে পার্থক্য রয়েছে?

JDK এর দ্বারা রেফারেন্সযুক্ত JAVA_HOMEপোম বর্ণিত সংস্করণের সাথে সামঞ্জস্যপূর্ণ তবে এটি কোনও সমস্যা নয় তবে একটি ভাল ক্রস-সংকলন সামঞ্জস্য নিশ্চিত করার জন্য bootstrapJVM বিকল্পটি যোগ করার বিষয়ে চিন্তা rt.jarকরুনtarget সংস্করণ।

একটি গুরুত্বপূর্ণ বিষয় বিবেচনা করতে হবে তা হল যে sourceএবং targetম্যাভেন কনফিগারেশনের সংস্করণটি দ্বারা বর্ণিত জেডিকে সংস্করণটির চেয়ে সেরা নয় JAVA_HOME
জেডিকে-র একটি পুরানো সংস্করণ আরও সাম্প্রতিক সংস্করণের সাথে সংকলন করতে পারে না কারণ এটির স্পেসিফিকেশন জানেন না।

ব্যবহৃত জেডিকে অনুসারে উত্স সম্পর্কে তথ্য, লক্ষ্য এবং মুক্ত সংস্করণ প্রকাশের জন্য, জাভা সংকলন: উত্স, লক্ষ্য এবং রিলিজ সমর্থিত সংস্করণগুলি দেখুন


জেভিএহোম দ্বারা উল্লিখিত জেডিকে কেস কীভাবে পরিচালনা করবেন জাভা টার্গেট এবং / বা উত্স সংস্করণে পম অনুসারে সামঞ্জস্য নয়?

উদাহরণস্বরূপ, যদি JAVA_HOMEআপনি একটি জেডিকে ১.7 উল্লেখ করে এবং আপনি আপনার পম.এক্সএমএল এর সংকলক কনফিগারেশনে উত্স এবং লক্ষ্য হিসাবে একটি জেডিকে ১.৮ নির্দিষ্ট করে থাকেন তবে এটি একটি সমস্যা হবে কারণ ব্যাখ্যা হিসাবে বলা হয়েছে, জেডিকে ১. doesn't কীভাবে সংকলন করতে জানেন না ।
এর দৃষ্টিকোণ থেকে এটি এটি একটি অজানা জেডিকে সংস্করণ এটি প্রকাশিত হওয়ার পরে এটি প্রকাশিত হয়েছে was
এই ক্ষেত্রে, আপনার এইভাবে জেডিকে নির্দিষ্ট করতে মাভেন সংকলক প্লাগইনটি কনফিগার করা উচিত:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <compilerVersion>1.8</compilerVersion>      
        <fork>true</fork>
        <executable>D:\jdk1.8\bin\javac</executable>                
    </configuration>
</plugin>

ম্যাভেন সংকলক প্লাগইন সহ উদাহরণগুলিতে আপনার আরও বিশদ থাকতে পারে ।


এটি জিজ্ঞাসা করা হয় না তবে ক্ষেত্রেগুলি যখন আপনি উত্স নির্দিষ্ট করে তবে লক্ষ্য না করে এমন ক্ষেত্রে আরও জটিল হতে পারে। এটি উত্স সংস্করণ অনুযায়ী টার্গেটে ভিন্ন সংস্করণ ব্যবহার করতে পারে। বিধিগুলি বিশেষ: আপনি ক্রস-সংকলন বিকল্প অংশে সেগুলি সম্পর্কে পড়তে পারেন ।


সংকলক প্লাগইনটি কেন packageআপনি পোম.এক্সএমএল এ উল্লেখ না করলেও মাভেন গোলটি কার্যকর করার সময় আউটপুটটিতে ট্রেস করা হয়?

আপনার কোডটি সংকলন করতে এবং সাধারণত সাধারণভাবে কোনও মেভেন লক্ষ্যের জন্য প্রয়োজনীয় সমস্ত কাজ সম্পাদনের জন্য, মাভেনের সরঞ্জাম প্রয়োজন। সুতরাং, কোর ম্যাভেন প্লাগিন ব্যবহার (আপনি একটি কোর ম্যাভেন প্লাগইন চিনতে তার groupId: org.apache.maven.plugins) প্রয়োজন কাজগুলো করুন: সংকলন ক্লাস, পরীক্ষা নির্বাহ জন্য পরীক্ষা প্লাগইন, এবং তাই জন্য ... তাই জন্য কম্পাইলার প্লাগইন, এমনকি যদি আপনি না এই প্লাগইনগুলি ঘোষণা করুন, তারা ম্যাভেন জীবনচক্রের কার্য সম্পাদনের জন্য আবদ্ধ।
আপনার মাভেন প্রকল্পের মূল ডায়ারে আপনি কমান্ডটি চালাতে পারেন: mvn help:effective-pomচূড়ান্ত পম কার্যকরভাবে ব্যবহার করতে। আপনি মাভেন দ্বারা সংযুক্ত প্লাগইনগুলি (আপনার pom.xML এ নির্দিষ্ট বা না) এর সাথে দেখা যেতে পারে, ব্যবহৃত সংস্করণ, তাদের কনফিগারেশন এবং লাইফসাইকেলের প্রতিটি ধাপের জন্য নির্ধারিত লক্ষ্যগুলি সহ আপনি দেখতে পেলেন।

mvn help:effective-pomকমান্ডের আউটপুটে আপনি <build><plugins>উপাদানটির এই মূল প্লাগইনগুলির ঘোষণা দেখতে পেলেন :

...
<plugin>
   <artifactId>maven-clean-plugin</artifactId>
   <version>2.5</version>
   <executions>
     <execution>
       <id>default-clean</id>
       <phase>clean</phase>
       <goals>
         <goal>clean</goal>
       </goals>
     </execution>
   </executions>
 </plugin>
 <plugin>
   <artifactId>maven-resources-plugin</artifactId>
   <version>2.6</version>
   <executions>
     <execution>
       <id>default-testResources</id>
       <phase>process-test-resources</phase>
       <goals>
         <goal>testResources</goal>
       </goals>
     </execution>
     <execution>
       <id>default-resources</id>
       <phase>process-resources</phase>
       <goals>
         <goal>resources</goal>
       </goals>
     </execution>
   </executions>
 </plugin>
 <plugin>
   <artifactId>maven-compiler-plugin</artifactId>
   <version>3.1</version>
   <executions>
     <execution>
       <id>default-compile</id>
       <phase>compile</phase>
       <goals>
         <goal>compile</goal>
       </goals>
     </execution>
     <execution>
       <id>default-testCompile</id>
       <phase>test-compile</phase>
       <goals>
         <goal>testCompile</goal>
       </goals>
     </execution>
   </executions>
 </plugin>
  ...

মাভেন ডকুমেন্টেশনে ম্যাভেন লাইভসাইলে পরিচয় করিয়ে দেওয়ার বিষয়ে আপনার আরও এই তথ্য থাকতে পারে ।

তবুও, আপনি যখন এই প্লাগইনগুলিকে ডিফল্ট মান হিসাবে অন্য মানগুলির সাথে কনফিগার করতে চান তখন ঘোষণা করতে পারেন (উদাহরণস্বরূপ, আপনি যখন এটি ব্যবহার করার জন্য জেডিকে সংস্করণ সামঞ্জস্য করতে আপনার pom.xML এ মাভেন-কম্পাইলার প্লাগইন ঘোষণা করেছিলেন) বা আপনি যখন করেছিলেন মাভেন জীবনচক্রটিতে ডিফল্টরূপে ব্যবহার না করা কিছু প্লাগইন মৃত্যুদন্ড যুক্ত করতে চান।


ব্যাপক ব্যাখ্যার জন্য ধন্যবাদ, এখন এটি আমার কাছে আরও স্পষ্ট। এছাড়াও <জাভা.ওভারশন> সম্পর্কে - আমি এটি কিছু কোড স্নিপেটে দেখেছি, এটি সম্ভবত কিছু কাস্টম সম্পত্তি ছিল এবং আমি ভুলভাবে ধরে <maven.compiler.x>নিয়েছিলাম যে এটি জাভা সংস্করণ ঘোষণার উপায়, এখন থেকে সম্পত্তিটিতে আটকে থাকবে।
প্ল্লেজেজজ

আপনাকে স্বাগতম, আনন্দের সাথে :) প্রথমদিকে, আমার এতটা বিকাশের উদ্দেশ্য ছিল না তবে আমি যখন শুরু করেছি তখন আমি থামাতে পারিনি :) For <java.version> For এর পক্ষে এটি খুব সম্ভবত। আপনি এবং ভাল maven দেখুন!
ডেভিডএক্সএক্সএক্সএক্স

1
" যদি আপনার JAVA_HOME এর JDK পোমের বর্ণিত সংস্করণগুলির সাথে সামঞ্জস্য করে তবে এটি কোনও সমস্যা নয় " এটি সত্য নয় (প্রয়োজনীয়) সত্য নয়, রেফারেন্সের জন্য এই স্ট্যাক ওভারফ্লো থ্রেডটি পরীক্ষা করুন
A_Di-Matteo

2
@ রবিন এ মেইড মতামতের জন্য আপনাকে ধন্যবাদ। আমি স্প্রিং বুট ব্যবহার করি তবে আমি এটি জানতাম না। ব্যক্তিগতভাবে আমি এটি ব্যবহারের মতো যথেষ্ট হিসাবে মানক বা রেফারেন্স হিসাবে যথেষ্ট মান খুঁজে পাই নি। স্প্রিং বুট কিছু খুব আকর্ষণীয় জিনিস অফার করে তবে কিছু ক্ষেত্রে এর বৈশিষ্ট্যগুলি খুব বিতর্কিত। উত্স এবং লক্ষ্য jdk উভয়ই পূরণ না করার জন্য একটি মানক খাঁটি সম্পত্তির নামটি ওভাররাইড করা সত্যিই একটি খারাপ ধারণা হিসাবে উপস্থিত হয় কারণ এটি কোনও অ্যাপ্লিকেশনের জন্য একক সময় সঞ্চালিত হয়। আপনি আপনার অ্যাপ্লিকেশনটিতে একটি সাধারণ এক্সএমএল লাইন ছাড়ার মান হারিয়েছেন। ওহ! কী ধারণা ...
ডেভিডএক্সএক্সএক্স

1
@ মাস্টারজো 2 আপনি এটি 10 ​​সংস্করণের অফিশিয়াল জাভাক ডকুমেন্টেশনে খুঁজে পেয়েছেন : ডকস.অরাকল . com / জাভাসে / ১০ / টোয়েলস / জাভাক এইচটিএম# জেএসডাব্লিউআইআর 627 । : আমি বিভক্ত দুই অংশ অত্যন্ত বড় হয়ে যাওয়ার কারণে উত্তর, এছাড়াও আপনি যে সন্ধান করতে পারেন ছিল stackoverflow.com/questions/51692748/...
davidxxx

3

উপরের সমাধানগুলির কোনওটিই সরাসরি আমার জন্য কার্যকর হয়নি। সুতরাং আমি নিম্নলিখিতগুলি করেছি: -

  1. যোগ করা হয়েছে

    <properties> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.source>1.8</maven.compiler.source> </properties>

    pom.xML এ

  2. গিয়েছিলেন Project Properties > Java Build Path, তারপরে জেআরই সিস্টেম লাইব্রেরিটি মুছে ফেলা হয়েছে যা দেখানো হয়েছিল JRE1.5

  3. জোর করে প্রকল্পটি আপডেট করেছে।


আপনি জাভা 10 এবং তারপরের জন্য কোন সংস্করণ নির্দিষ্ট করেছেন? এটা কি 10 বা 1.10?
মাস্টারজয়ে 2

@ জাভা 9 এবং উপরের সংস্করণগুলি থেকে মাস্টারজয়ে 2 আপনাকে সংস্করণ নম্বরটি যেমনটি লিখতে হবে (<version> 10 </version>), এবং নীচের সংস্করণগুলির জন্য আপনাকে সংস্করণটির সামনে 1. যোগ করতে হবে (<রূপান্তর> 1.5
.5

0

বিকল্প বিবেচনা করুন:

<properties>
    <javac.src.version>1.8</javac.src.version>
    <javac.target.version>1.8</javac.target.version>
</properties>

এটি একই জিনিস হওয়া উচিত maven.compiler.source/maven.compiler.targetতবে উপরের সমাধানটি আমার পক্ষে কাজ করে, অন্যথায় দ্বিতীয়টি পিতামাতার স্পেসিফিকেশন পায় (আমার কাছে .pom এর ম্যাট্রিয়স্কা রয়েছে)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.