Điều gì khiến dự án Maven được nhập trong Eclipse sử dụng Java 1.5 thay vì Java 1.6 theo mặc định và làm cách nào tôi có thể đảm bảo nó không?


209

Tôi đã nhập một dự án Maven và nó đã sử dụng Java 1.5 mặc dù tôi có cấu hình 1.6 làm mặc định Eclipse Preferences->Java->Installed JREs.

Khi tôi thay đổi dự án Maven để sử dụng 1.6 JRE, nó vẫn còn các lỗi xây dựng còn sót lại khi dự án đang sử dụng Java 1.5 (Tôi đã mô tả các lỗi xây dựng này trước đó: Tôi có lỗi xây dựng với m2eclipse nhưng không phải với maven2 trên dòng lệnh - m2eclipse của tôi có bị định cấu hình sai không? )

Tôi sẽ xóa dự án và thử lại nhưng tôi muốn chắc chắn rằng lần này nó sử dụng Java 1.6 ngay từ đầu để xem điều này có loại bỏ được các vấn đề xây dựng không.

Làm cách nào để đảm bảo dự án sử dụng Java 1.6 khi tôi nhập nó?


4
m2eclipse bỏ qua những gì bạn định cấu hình cho mặc định của Eclipse. Nó sẽ luôn sử dụng 1.5 theo mặc định. Tuy nhiên, trong trường hợp của bạn, dự án sử dụng plugin maven-Trình biên dịch và đặt phiên bản rõ ràng là 1.5. Bạn sẽ cần thay đổi điều đó trong pom và cập nhật cấu hình dự án để thay đổi phiên bản. Tuy nhiên tôi đã thử điều này và nó không hiệu quả với tôi. Tôi khá chắc chắn rằng đó không phải là vấn đề mặc dù những gì người khác nói trong câu hỏi khác của bạn.
Raoul Duke

1
Không, m2eclipse sẽ không luôn luôn mặc định là 1.5, nó sẽ mặc định cho các cài đặt của maven-Trình biên dịch-plugin.
Pascal Thivent

1
Làm thế nào để bạn thay đổi cài đặt của maven-Trình biên dịch-plugin?
Lokathor

Câu trả lời:


248

Plugin m2eclipse không sử dụng các giá trị mặc định của Eclipse, plugin m2eclipse lấy các cài đặt từ POM. Vì vậy, nếu bạn muốn một dự án Maven được cấu hình để sử dụng các cài đặt Java 1.6 khi được nhập trong Eclipse, hãy định cấu hình maven-compiler-pluginphù hợp, như tôi đã đề xuất:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>2.1</version>
  <configuration>
    <source>1.6</source>
    <target>1.6</target>
  </configuration>
</plugin>

Nếu dự án của bạn đã được nhập, hãy cập nhật cấu hình dự án ( nhấp chuột phải vào dự án sau đó Cấu hình dự án cập nhật Maven V ).


1
Xin đừng hét. Điều đó thật thô lỗ. Nó đã làm việc sau khi xóa và nhập lại dự án. Nhưng không thì khác.
Raoul Duke

6
@Raoul Nó hoạt động mà không cần nhập lại dự án nếu bạn cập nhật Cấu hình dự án như tôi đã viết. Tôi đã thử nghiệm điều này 3 lần và nó chỉ hoạt động trên máy của tôi.
Pascal Thivent

Rõ ràng như câu trả lời của Pascal là (tôi cộng với 1) nó 'cập nhật cấu hình dự án' dường như không hoạt động trong mọi trường hợp vì tôi cũng phải xóa dự án và tôi đã thử rất nhiều thứ khác (có lẽ là một lỗi trong một phiên bản của nhật thực)
rogermushroom

đối với các phiên bản Java mới hơn, hãy xem câu trả lời này
Dòng

33

Tôi đã thêm nó vào pom.xml của tôi bên dưới mô tả dự án và nó đã hoạt động:

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

1
Điều này đơn giản hơn câu trả lời được chấp nhận và cũng tốt cho tôi.
Gạch

1
Điều này làm việc cho tôi tuy nhiên câu trả lời được chấp nhận không hoạt động.
Sanjay Singh

1
Sự khác biệt giữa cái này và cấu hình maven-Trình biên dịch-plugin (theo câu trả lời được chấp nhận) là gì? Cả hai cách đều làm việc cho tôi.
Aamir Rizwan

Nếu bạn đang sử dụng Java 9, hãy lưu ý rằng việc đánh số phiên bản đã thay đổi. Vì vậy, sử dụng 9 thay vì 1.9. <properties> <maven.compiler.source>9</maven.compiler.source> <maven.compiler.target>9</maven.compiler.target> </properties>
chux

Tôi nghĩ rằng thiết lập một thuộc tính "java.version" và sử dụng nó trong cấu hình xây dựng của cấu hình "maven-Trình biên dịch-plugin" là đủ. Rõ ràng, các thuộc tính "maven.compiler.source" và "maven.compiler.target" phải có một số tương tác plugin Maven Eclipse khi vấn đề vừa biến mất.
JasonTolotta

29

Tôi muốn thêm một cái gì đó vào câu trả lời đã được cung cấp. maven-Trình biên dịch-plugin theo mặc định sẽ biên dịch dự án của bạn bằng Java 1.5, nơi m2e lấy thông tin của nó.

Đó là lý do tại sao bạn phải khai báo rõ ràng trình cắm maven-biên dịch trong dự án của bạn với thứ gì đó khác 1.5. Hiệu quả của bạn pom.xmlsẽ hoàn toàn sử dụng bộ mặc định trong plugin maven-Trình biên dịch pom.xml .


6
với tôi điều này trả lời rõ ràng hơn "tại sao lại là 1,5 khi tôi thực hiện một dự án Maven mới?"
Don Cheadle

1
@LIttleAncientForestKami xác minh với 3.7.0, bây giờ các giá trị được thiết lập như là hằng số DEFAULT_SOURCEDEFAULT_TARGET, nhưng vẫn còn cả bộ đến 1,5.
Adam Burley

Bây giờ nó phải là 1.6, phải không? Tôi tự hỏi vì nó dường như vẫn sử dụng 1,5 cho tôi.
Dòng

@Line: Không, nó có thể sẽ là 1,5 cho đến khi kết thúc câu thơ được biết đến như là pom cha mẹ siêu hiệu quả không bao giờ thay đổi.
Nicholas

Đây có phải là trớ trêu? ;) Trang web được liên kết trong câu trả lời cho biết "Cũng lưu ý rằng hiện tại cài đặt nguồn mặc định là 1.6 và cài đặt mục tiêu mặc định là 1.6" ..
Dòng

27
<project>

    <!-- ... -->

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

</project>

8
Bên trong <build> </ build>
Phillip Kamikaze

không thích câu trả lời này, vì đó chỉ là mã và tôi không thấy lợi thế so với mã được chấp nhận (có thể vì nó không được mô tả ..)
Dòng

8

Đây là nguyên nhân gốc của java 1.5:

Cũng lưu ý rằng hiện tại cài đặt nguồn mặc định là 1,5 và cài đặt mục tiêu mặc định là 1,5, độc lập với JDK mà bạn chạy Maven. Nếu bạn muốn thay đổi các giá trị mặc định này, bạn nên đặt nguồn và đích.

Tham khảo: Plugin trình biên dịch Mavem của Apache

Sau đây là các chi tiết:

Đồng bằng pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <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.pluralsight</groupId>
    <artifactId>spring_sample</artifactId>
    <version>1.0-SNAPSHOT</version>

</project>

Plugin sau được lấy từ phiên bản POM mở rộng (POM hiệu quả),

Điều này có thể nhận được bằng lệnh này từ dòng lệnh C:\mvn help:effective-pomtôi chỉ cần đặt ở đây một đoạn nhỏ thay vì toàn bộ pom.

    <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>

Ngay cả ở đây bạn cũng không thấy phiên bản java được xác định ở đâu, hãy khai thác thêm ...

Tải xuống plugin, Plugin Apache Maven Compiler »3.1 có sẵn trong jar và mở nó trong bất kỳ công cụ nén tệp nào như 7-zip

Đi qua bình và tìm

plugin.xml

tập tin bên trong thư mục

maven-Trình biên dịch-plugin-3.1.jar \ META-INF \ maven \

Bây giờ bạn sẽ thấy phần sau trong tệp,

      <configuration>
    <basedir implementation="java.io.File" default-value="${basedir}"/>
    <buildDirectory implementation="java.io.File" default-value="${project.build.directory}"/>
    <classpathElements implementation="java.util.List" default-value="${project.testClasspathElements}"/>
    <compileSourceRoots implementation="java.util.List" default-value="${project.testCompileSourceRoots}"/>
    <compilerId implementation="java.lang.String" default-value="javac">${maven.compiler.compilerId}</compilerId>
    <compilerReuseStrategy implementation="java.lang.String" default-value="${reuseCreated}">${maven.compiler.compilerReuseStrategy}</compilerReuseStrategy>
    <compilerVersion implementation="java.lang.String">${maven.compiler.compilerVersion}</compilerVersion>
    <debug implementation="boolean" default-value="true">${maven.compiler.debug}</debug>
    <debuglevel implementation="java.lang.String">${maven.compiler.debuglevel}</debuglevel>
    <encoding implementation="java.lang.String" default-value="${project.build.sourceEncoding}">${encoding}</encoding>
    <executable implementation="java.lang.String">${maven.compiler.executable}</executable>
    <failOnError implementation="boolean" default-value="true">${maven.compiler.failOnError}</failOnError>
    <forceJavacCompilerUse implementation="boolean" default-value="false">${maven.compiler.forceJavacCompilerUse}</forceJavacCompilerUse>
    <fork implementation="boolean" default-value="false">${maven.compiler.fork}</fork>
    <generatedTestSourcesDirectory implementation="java.io.File" default-value="${project.build.directory}/generated-test-sources/test-annotations"/>
    <maxmem implementation="java.lang.String">${maven.compiler.maxmem}</maxmem>
    <meminitial implementation="java.lang.String">${maven.compiler.meminitial}</meminitial>
    <mojoExecution implementation="org.apache.maven.plugin.MojoExecution">${mojoExecution}</mojoExecution>
    <optimize implementation="boolean" default-value="false">${maven.compiler.optimize}</optimize>
    <outputDirectory implementation="java.io.File" default-value="${project.build.testOutputDirectory}"/>
    <showDeprecation implementation="boolean" default-value="false">${maven.compiler.showDeprecation}</showDeprecation>
    <showWarnings implementation="boolean" default-value="false">${maven.compiler.showWarnings}</showWarnings>
    <skip implementation="boolean">${maven.test.skip}</skip>
    <skipMultiThreadWarning implementation="boolean" default-value="false">${maven.compiler.skipMultiThreadWarning}</skipMultiThreadWarning>
    <source implementation="java.lang.String" default-value="1.5">${maven.compiler.source}</source>
    <staleMillis implementation="int" default-value="0">${lastModGranularityMs}</staleMillis>
    <target implementation="java.lang.String" default-value="1.5">${maven.compiler.target}</target>
    <testSource implementation="java.lang.String">${maven.compiler.testSource}</testSource>
    <testTarget implementation="java.lang.String">${maven.compiler.testTarget}</testTarget>
    <useIncrementalCompilation implementation="boolean" default-value="true">${maven.compiler.useIncrementalCompilation}</useIncrementalCompilation>
    <verbose implementation="boolean" default-value="false">${maven.compiler.verbose}</verbose>
    <mavenSession implementation="org.apache.maven.execution.MavenSession" default-value="${session}"/>
    <session implementation="org.apache.maven.execution.MavenSession" default-value="${session}"/>
  </configuration>

Nhìn vào đoạn mã trên và tìm ra 2 dòng sau

    <source implementation="java.lang.String" default-value="1.5">${maven.compiler.source}</source>
    <target implementation="java.lang.String" default-value="1.5">${maven.compiler.target}</target>

Chúc may mắn.


1
Đúng. Điều này không có gì để làm với Eclipse. Ví dụ: bạn gặp vấn đề tương tự trong IntelliJ IDEA nếu tạo dự án Maven với quickstarttạo phẩm.
Jan Hettich

Xin chào, cảm ơn bạn đã đăng nguyên nhân gốc rễ của vấn đề :) Tôi thực sự đánh giá cao nó!
IanGabes

6

JRE của bạn có thể đã được xác định trong cấu hình chạy. Thực hiện theo các bước trong Eclipse để thay đổi JRE xây dựng.

1) Nhấp chuột phải vào dự án và chọn Run As > Run Cấu hình

2) Từ cửa sổ Chạy Cấu hình, chọn cấu hình xây dựng dự án của bạn trên bảng điều khiển bên trái. Ở bên phải, bạn sẽ thấy các tab khác nhau: Chính, JRE, Làm mới, Nguồn, ...

3) Nhấp vào tab JRE, bạn sẽ thấy một cái gì đó như thế này

nhập mô tả hình ảnh ở đây

4) Theo mặc định, JRE mặc định làm việc (JRE bạn chọn làm mặc định trong Tùy chọn-> Java-> JRE đã cài đặt ) sẽ được sử dụng. Nếu bạn muốn sử dụng một JRE được cài đặt khác, đánh dấu vào hộp kiểm JRE thay thế và chọn JRE ưa thích của bạn từ danh sách thả xuống.


Cảm ơn câu trả lời này, cấu hình chạy của tôi đã chạy với mặc định không gian làm việc để điều này thực sự hữu ích!
Damir Ciganović-Janković

Điều này đã giúp, không thể tin rằng chúng tôi bỏ qua điều này!
phil oO

3

Giải pháp đơn giản nhất trong Springboot

Tôi sẽ cung cấp cho bạn đơn giản nhất nếu bạn sử dụng Springboot:

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

Sau đó, nhấp chuột phải vào dự án Eclipse của bạn: Maven> Cập nhật dự án> Cập nhật cấu hình dự án từ pom.xml

Điều đó nên làm.


2

Cài đặt cụ thể của dự án

Một nơi nữa mà điều này có thể sai là trong các cài đặt cụ thể của dự án, trong Eclipse.

  1. thuộc tính dự án: nhấp vào dự án của bạn và một trong những điều sau đây:

    • Alt + Enter
    • Menu> Dự án> Thuộc tính
    • nhấp chuột phải vào dự án của bạn> thuộc tính dự án (mục cuối cùng trong menu)
  2. nhấp vào "Trình biên dịch Java"

  3. Bỏ chọn "Bật cài đặt cụ thể của dự án" (hoặc thay đổi tất cả bằng tay).

Do yêu cầu của khách hàng, chúng tôi đã kích hoạt chúng để giữ các dự án của chúng tôi trong 1.6. Khi cần nâng cấp lên 1.7, chúng tôi đã có một khoảng thời gian khó khăn vì chúng tôi cần thay đổi phiên bản java ở mọi nơi:

  • dự án POM
  • Không gian làm việc của Eclipse
  • thiết lập cụ thể của dự án
  • thực thi máy ảo (1.6 đã được sử dụng cho mọi thứ)

1

Thêm một lý do có thể nếu bạn đang sử dụng TychoMaven để xây dựng các gói, rằng bạn có môi trường thực thi sai ( Bundle-RequiredExecutionEnvironment) trong tệp kê khai ( manifest.mf) được xác định. Ví dụ:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Engine Plug-in
Bundle-SymbolicName: com.foo.bar
Bundle-Version: 4.6.5.qualifier
Bundle-Activator: com.foo.bar.Activator
Bundle-Vendor: Foobar Technologies Ltd.
Require-Bundle: org.eclipse.core.runtime,
 org.jdom;bundle-version="1.0.0",
 org.apache.commons.codec;bundle-version="1.3.0",
 bcprov-ext;bundle-version="1.47.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.5
Export-Package: ...
...
Import-Package: ...
...

Trong trường hợp của tôi, mọi thứ khác đều ổn. Các plugin trình biên dịch (maven và tycho bình thường) cũng được đặt chính xác, vẫn tạo ra mức tuân thủ cũ vì biểu hiện. Tôi nghĩ rằng tôi chia sẻ kinh nghiệm.


1

Tôi thấy rằng vấn đề của tôi là ai đó đã cam kết tệp .project và. Classpath có tham chiếu đến Java1.5 làm JRE mặc định.

<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
    <attributes>
        <attribute name="owner.project.facets" value="java"/>
    </attributes>
</classpathentry>

Bằng cách đóng dự án, xóa các tệp và sau đó nhập lại dưới dạng dự án Maven, tôi có thể đặt dự án đúng cách sử dụng JRE không gian làm việc hoặc jdk có liên quan mà không bị lùi về 1.5. Vì vậy, tránh kiểm tra vào SVN của bạn các tệp .project và. Classpath

Hy vọng điều này sẽ giúp những người khác.


0

Nếu bạn muốn đảm bảo rằng các dự án mới được tạo hoặc các dự án đã nhập trong Eclipse sử dụng một phiên bản java mặc định khác so với Java 1.5, bạn có thể thay đổi cấu hình trong maven-Trình biên dịch-plugin.

  • Chuyển đến thư mục .m2 / repository / org / apache / maven / plugins / maven-Trình biên dịch-plugin / 3.1
  • Mở maven-Trình biên dịch-plugin-3.1.jar bằng chương trình zip.
  • Truy cập META-INF / maven và mở plugin.xml
  • Trong các dòng sau:
    <source triển khai = "java.lang.String" default-value = "1.5"> $ {maven.compiler.source} </ source>
    <target exec = "java.lang.String" default-value = "1,5"> $ {maven.compiler.target} </ target>

  • thay đổi giá trị mặc định thành 1.6 hoặc 1.8 hoặc bất cứ điều gì bạn thích.

  • Lưu tệp và đảm bảo rằng nó được ghi lại vào tệp zip.

Từ giờ trở đi, tất cả các dự án Maven mới đều sử dụng phiên bản java mà bạn đã chỉ định.

Thông tin được lấy từ bài đăng trên blog sau: https://sandocean.wordpress.com/2019/03/22/directly-generating-maven-projects-in-eclipse-with-java-version-newer-than-1-5/


0

Để thay đổi phiên bản của JDK, bạn có thể làm:

1- Dự án> Thuộc tính
2- Chuyển đến Đường dẫn xây dựng Java
3- Trong Thư viện, chọn Hệ thống JRE ... và nhấp vào Chỉnh sửa
4- Chọn phiên bản phù hợp của bạn và xác thực

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.