java ecj_java - 在Maven构建中使用Eclipse Java Compiler(ecj) - 堆栈内存溢出
與標準Javac編譯器相比,Eclipse Java編譯器(ecj)具有很多優勢。 它速度很快,并且可以配置更多警告和錯誤,從而提高了代碼質量。 編譯器中最有趣的事情之一是在編譯器內部添加了null類型 :通過使用@Nullable和@NotNull注釋對代碼進行注釋,可以強制Eclipse編譯器在編譯時而不是運行時檢查null訪問。 嚴格應用時,它會教您以更安全的方式編碼(通過防止空值),并防止在測??試或生產過程中發生NPE異常。
在Maven內部使用Eclipse編譯器并不難,但是Internet上存在很多錯誤信息和舊信息,這引起了很多混亂。 我希望這有助于使事情變得正確。
要使Eclipse使用ecj編譯器,您需要使用plexus-compiler-eclipse插件,而無需使用其他任何工具。 典型的配置如下:
org.apache.maven.plugins
maven-dependency-plugin
org.apache.maven.plugins
maven-compiler-plugin
3.7.0
eclipse
${source.jdk.version}
${target.jdk.version}
${project.basedir}/.settings/org.eclipse.jdt.core.prefs
true
true
org.codehaus.plexus
plexus-compiler-eclipse
2.8.3
org.eclipse.jdt
ecj
3.13.101
將這部分放在您的父/根pom的pluginManagement或build部分中。
現在讓我們解釋不同的部分;)
maven-compiler-plugin必須是最新版本。 源參數和目標參數定義了用于源代碼和字節碼的Java版本,通常是相同的。
將參數傳遞給編譯器是一個徹底的麻煩。 請參閱下面的單獨部分。 在本示例中,我使用屬性設置,該屬性設置使我能夠提供詳細的設置,以進行編譯時要出現的錯誤和警告。 通過在參數中使用$ {project.basedir}變量,我對每個項目進行了以下設置:每個項目都需要有一個.settings / org.eclipse.jdt.core.prefs文件(很幸運,該文件所在的位置Eclipse IDE會保留其編譯器設置)。
對plexus-codehaus-eclipse的依賴關系定義了知道如何運行Eclipse編譯器的插件。 2.8.3版本是撰寫本文時的最新版本,但該版本存在一些問題。 2.8.4版應該帶有一個改寫后的編譯器接口,該接口可以解決很多問題,但在撰寫本文時仍在使用此版本。 您可以在此處找到有關該插件的詳細信息 ,因此可以在新發行版/代碼更改后關注進度。
另一個重要的依賴項是org.eclipse.jdt:ecj依賴項:這個依賴項指定了要使用的ecj編譯器的確切版本 。 您應該始終指定它,因為如果在發布大版本之前一天插件決定使用另一版本的編譯器,則構建穩定性會受到損害;)用于ecj編譯器的版本號有點問題。 您也許可以從發行列表中找到版本號,然后檢查該Maven存儲庫中是否有類似的東西。 但是此存儲庫僅包含舊版本。 當您需要更新的版本時,您顯然應該在此處查看 該版本 -這是Eclipse 當前發布其版本的地方 。 這個較新的存儲庫消除了較早版本的易于識別的版本號; 如上所述,它使用的版本號如3.1xx。 Eclipse通常每年發布一次主要版本,中間還發布一個或兩個修訂版本。 3.13.x編號的第二部分對應于Eclipse Platform項目中用于發行版的內部版本控制。 很難獲得列表,但至少這些是已知的:
Version Eclipse Release Compiler Version
3.13.0 Oxygen Release 4.7
3.13.50 Oxygen 1a 4.7.1a
3.13.100 Oxygen R2 4.7.2
該版本始終以3開頭,13或多或少是發布的“年份”。 因此,當13為Oxygen(2017,4.7)時14可能是光子(2018,4.8)。
plexus-compiler-eclipse插件的版本:2.8.4之前
plexus-compiler-plugin 2.8.4之前的版本使用內部API啟動Eclipse編譯器。 這會導致很多事情無法正常運行,例如,此內部API不能解釋ecj編譯器的常規命令行參數。 這使其很難使用,并且不支持某些功能。 以下是限制列表:
注釋處理未實現。 任何配置都會被靜默忽略。
使用標記添加特定參數非常困難,因為實現存在多個問題:
編譯器mojo似乎會在此處輸入的所有參數中添加破折號。 但是,此版本插件使用的內部API需要帶破折號的參數。 因此,插件再次將其刪除。 由于這里的參數并不是真正的命令行ecj參數,因此很難知道要使用哪些參數:有關細節,請查看Eclipse源代碼中的Compiler.java類和CompilerOptions.java類。
插件確實在此處接受一些參數,但是這些參數由插件本身解釋,然后“翻譯”為內部api。
此插件在>標記中接受以下參數:
文件名 properties>:定義一個屬性文件,該文件將傳遞給編譯器的-properties參數。 通過查看Eclipse項目中的.settings / org.eclipse.jdt.core.prefs文件,可以找到此文件格式的示例:該文件存儲編譯器的配置。 它包含警告,錯誤和信息性消息的設置以及編譯器符合性設置。
任何內容 errorsAsWarnings>。 有效時,插件將忽略編譯器生成的任何錯誤,并將其報告為警告。 當然,編譯仍然會失敗,因此根據錯誤,可能已經編寫/更新了.class文件。 這由插件本身處理:它只是將所有錯誤更改為警告,并告訴世界編譯工作。
從2.8.4開始
plexus-compiler-eclipse插件的2.8.4版本已被大部分重寫。 現在,它使用ECJ編譯器的公共API,或多或少是ECJ編譯器本身。 舉例來說,這意味著ECJ插件現在可以做的所有事情(例如注釋處理),并且將標簽中輸入的參數傳遞給編譯器,這意味著您應該能夠使用ecj的幫助頁面來查找有趣的東西。要添加的參數。
像以前的版本一樣,該版本還要求您從所有參數名稱中刪除“-”。 在將參數名稱添加到ecj命令行之前,會再次自動添加破折號。
該版本支持Maven定義的注釋處理。 通過將所需的部分添加到編譯Blob中,可以運行注釋處理器。 例如:
org.apache.maven.plugins
maven-compiler-plugin
${maven-compiler-plugin.version}
db.annotationprocessing.EntityAnnotationProcessor
to.etc.domui
property-annotations-processor
1.2-SNAPSHOT
to.etc.domui
property-annotations-processor
1.2-SNAPSHOT
這部分似乎不完整,因為根本沒有引用plexus-compiler-eclipse插件,但是請記住,在Maven中,該配置繼承了:在這種情況下,父POM包含上面的部分,而這只是為該部分添加了一些配置。僅此POM的項目。
總結
以上是生活随笔為你收集整理的java ecj_java - 在Maven构建中使用Eclipse Java Compiler(ecj) - 堆栈内存溢出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 精通spring——深入java ee开
- 下一篇: 北斗系统正式加入国际民航组织标准 可全球