आप pom.xml फ़ाइल में जावा कंपाइलर संस्करण कैसे निर्दिष्ट करते हैं?


252

मैंने netbeans पर एक मावेन कोड लिखा है जिसमें लगभग 2000 से अधिक लाइनें हैं। जब मैं इसे netbeans पर संकलित करता हूं, तो सब कुछ ठीक है, लेकिन अगर मैं इसे कमांड लाइन पर चलाना चाहता हूं, तो मुझे ये त्रुटियां मिलेंगी:

generics are not supported in -source 1.3
(use -source 5 or higher to enable generics)
        ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();

generics are not supported in -source 1.3
(use -source 5 or higher to enable generics)
        HashSet<Double> resid_List = new HashSet<Double>(Arrays.asList(resid_val));

generics are not supported in -source 1.3
(use -source 5 or higher to enable generics)
        List<Integer> ind_ovlpList = new ArrayList<Integer>(Arrays.asList(ind_ovlp));

generics are not supported in -source 1.3
(use -source 5 or higher to enable generics)
public class ColumnComparator implements Comparator<double[]> {

annotations are not supported in -source 1.3
(use -source 5 or higher to enable annotations)
@Override

मैंने जावा 1.3.1, कंपाइलर त्रुटियों का उपयोग करने की कोशिश की , लेकिन मुझे अधिक त्रुटियां मिलीं। मैंने अन्य पोस्टों से पाया कि मुझे pom.xml को संशोधित करना चाहिए, लेकिन मुझे नहीं पता कि कैसे। यहाँ मेरा pom.xml है

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany</groupId>
  <artifactId>mavenmain</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>mavenmain</name>
    <url>http://maven.apache.org</url>

   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

   <dependencies>
     <dependency>
       <groupId>junit</groupId>
        <artifactId>junit</artifactId>
       <version>3.8.1</version>
       <scope>test</scope>
     </dependency>
     <dependency>
        <groupId>gov.nist.math</groupId>
        <artifactId>jama</artifactId>
        <version>1.0.2</version>
     </dependency>
   </dependencies>
 </project>

यह बहुत अच्छा होगा यदि आप मेरी मदद कर सकते हैं।


2
जावा संस्करण को अपग्रेड करने का समय।
सोतीरियोस डेलिमोलिस

5
जावा 5 से जेनरिक का समर्थन किया जाता है। जावा संस्करण से पहले उन्हें काम करना असंभव है।
लुइगी मेंडोज़ा

OpenJDK javac के लिए डिफ़ॉल्ट 1.3 है, जहां Oracle JDK के लिए यह 1.5 है
Thorbjørn Ravn Andersen

दोनों जो मुझे एक प्रोग्रामर होने की भविष्यवाणी करते हैं!
कोराथन

जवाबों:


307
<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>(whatever version is current)</version>
        <configuration>
          <!-- or whatever version you use -->
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
      </plugin>
    </plugins>
    [...]
  </build>
  [...]
</project>

मावेन कंपाइलर प्लगइन के लिए विन्यास पृष्ठ देखें:

http://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html

ओह, और: जावा 1.3.x का उपयोग न करें, वर्तमान संस्करण जावा 1.7.x या 1.8.x हैं


4
आप JDK संस्करण पर एक चेक जोड़ना चाह सकते हैं जिसका उपयोग आप Maven को Maven Enforcer Plugin के साथ चलाने के लिए कर रहे हैं: maven.apache.org/enforcer/maven-enforcer-plugin यह बहुत सुविधाजनक है क्योंकि मुझे विभिन्न परियोजनाओं का समर्थन करना है विभिन्न JDK संस्करणों पर हैं। यह उदाहरण के लिए जावा 7 प्रोजेक्ट पर जावा 8 के साथ संकलित होने से बचता है।
विम डेब्लाउउ

2
प्लगइन संस्करण गायब है। यह एक त्रुटि नहीं फेंक सकता है, लेकिन यह दृढ़ता से अनुशंसित है, वहां संस्करण को सेट करने के लिए। वर्तमान संस्करण 3.3 है
लुकास वर्नर

1
@LukasWerner आप बिल्कुल सही हैं। लेकिन अगर मैं एक संस्करण जोड़ता हूं तो मुझे हर कुछ महीनों में प्रश्न को संपादित करना होगा। एक समझौता के लिए चला गया :-)
सीन पैट्रिक फ्लोयड

कृपया स्पष्ट करें ... इस टैग में क्या जाता है <संस्करण> (जो भी संस्करण वर्तमान है) </ संस्करण>? यह 1.7 की तरह कुछ है?
एलिजा

2
@ एलाइजा नहीं, यह जावा भाषा का संस्करण होगा। मैं प्लगइन संस्करण के बारे में बात कर रहा हूँ। : यदि आप इस लिंक के माध्यम से प्राप्त कर सकते हैं कि mvnrepository.com/artifact/org.apache.maven.plugins/...
शॉन पैट्रिक फ्लोयड

360

maven-compiler-plugin यह पहले से ही pom.xml में पदानुक्रम निर्भरता प्लगइन्स में मौजूद है। प्रभावी पीओएम में जाँच करें।

संक्षेप में आप इस तरह के गुणों का उपयोग कर सकते हैं:

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

मैं मावेन 3.2.5 का उपयोग कर रहा हूं


कौन सा तरीका "सर्वश्रेष्ठ" है? यह एक चयनित उत्तर की तुलना में कम क्रिया है, लेकिन यह छिपे हुए की तरह लगता है। यहां तक ​​कि मावेन साइट प्रलेखन प्लगइन का उपयोग करके दिखाता है।
mkobit

2
@mkobit मुझे लगता है कि यह एक व्यक्तिगत पसंद है। यदि मुझे संकलक और स्रोत संस्करण के अलावा कुछ और कॉन्फ़िगर करने की आवश्यकता है जो मैं प्लगइन्स अनुभाग में करना चाहता हूं।
leocborges

1
"कुछ और कॉन्फ़िगर करें" के साथ अच्छा बिंदु। अगर मुझे google / error-prone जैसी किसी चीज़ का उपयोग करना है , तो मुझे प्लगइन्स अनुभाग का उपयोग करना होगा।
mkobit

5
यह अब मवन प्रलेखन पृष्ठ पर पहला तरीका है जो @mkobit ने दिया था। बहुत अच्छे, और आपको संकलक प्लगइन के संस्करण को पिन करने की आवश्यकता नहीं है।
Danila Piatov

IntelliJ में प्रोजेक्ट को दोबारा बनाने के बाद मैंने इसके लिए काम किया। मुझे एक नई परियोजना के रूप में प्रोजेक्ट की pom फ़ाइल को खोलकर IntelliJ में प्रोजेक्ट को फिर से खोलना पड़ा जिसे मैं प्रोजेक्ट को फिर से बना रहा हूँ।
user674669

13

आम तौर पर आप केवल sourceसंस्करण ( javac -source 1.8उदाहरण के लिए) को महत्व नहीं देना चाहते, लेकिन आप sourceऔर targetसंस्करण ( javac -source 1.8 -target 1.8उदाहरण के लिए) दोनों को महत्व देना चाहते हैं ।
ध्यान दें कि जावा 9 से, आपके पास क्रॉस-संकलन संगतता ( javac -release 9) के लिए जानकारी और अधिक मजबूत तरीके से संप्रेषित करने का एक तरीका है ।
मावेन जो javacकमांड को लपेटता है, इन सभी जेवीएम मानक विकल्पों को व्यक्त करने के कई तरीके प्रदान करता है।

JDK संस्करण कैसे निर्दिष्ट करें?

का उपयोग करना 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, ध्यान दें कि maven संकलक के बाद से 3.8.0, डिफ़ॉल्ट मानों से बदल गया 1.5है1.6

मावेन-कंपाइलर-प्लगइन 3.6 से आपके पास जावा संस्करण को निर्दिष्ट करने का एक नया तरीका है

आप उपयोग कर सकते हैं तर्क :release

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

आप केवल उपयोगकर्ता संपत्ति की घोषणा कर सकते हैं maven.compiler.release:

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

लेकिन इस समय अंतिम एक पर्याप्त नहीं होगा क्योंकि maven-compiler-pluginआपके द्वारा उपयोग किए जाने वाले डिफ़ॉल्ट संस्करण हाल के पर्याप्त संस्करण पर भरोसा नहीं करता है।

मावेन releaseतर्क बताता है release: एक नया JVM मानक विकल्प जिसे हम जावा 9 से पास कर सकते हैं:

एक विशिष्ट वीएम संस्करण के लिए सार्वजनिक, समर्थित और प्रलेखित एपीआई के खिलाफ संकलन।

यह तरीका source, targetऔर bootstrapJVM विकल्पों के लिए समान संस्करण को निर्दिष्ट करने का एक मानक तरीका प्रदान करता है ।
ध्यान दें कि bootstrapक्रॉस संकलनों के लिए एक अच्छा अभ्यास निर्दिष्ट है और यदि आप क्रॉस संकलन नहीं करते हैं तो यह चोट नहीं पहुंचेगी।

JDK संस्करण को निर्दिष्ट करने का सबसे अच्छा तरीका कौन सा है?

जावा 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तर्क (तीसरा बिंदु) एक तरह से दृढ़ता से विचार करने के लिए आप के लिए एक ही संस्करण उपयोग करना चाहते हैं है sourceऔर target


10

मुझे ग्रहण नियोन सरल मावेन जावा परियोजना में एक ही मुद्दे का सामना करना पड़ा

लेकिन मैं नीचे विवरण pom.xml फ़ाइल के अंदर जोड़ता हूं

   <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

प्रोजेक्ट पर राइट क्लिक करने के बाद> maven> अपडेट प्रोजेक्ट (चेक फोर्स अपडेट)

इसका मुझे प्रोजेक्ट पर त्रुटि प्रदर्शित करने का संकल्प है

आशा है कि यह मददगार होगा

Thansk


यह मेरे लिए तब काम आया जब मैं SQL सर्वर के लिए Microsoft JDBC ड्राइवर के लिए SqlServerSample ऐप बनाने की कोशिश कर रहा था।
स्काई --- कप्तान

0
<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
                <fork>true</fork>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin> 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.