java 编译 器 ide_在没有IDE的情况下编译和运行Java
java 編譯 器 ide
最近一個名為“ 不使用IDE編譯Java軟件包 ”的Java subreddit線程提出了一個問題:“是否有一個命令將軟件包內(nèi)的一組Java文件編譯到一個單獨的文件夾中(以下簡稱為bin),以及如何我會去運行新的類文件嗎?” 該帖子的作者kylolink解釋說:“當(dāng)我開始使用Java時,我依靠Eclipse為我完成所有編譯,而只是擔(dān)心編寫代碼。” 我已經(jīng)多次看到這個問題,實際上,這是促使我(現(xiàn)在已經(jīng)4歲)的博客文章GPS系統(tǒng)和IDE的原因:有用還是有害? 我喜歡強(qiáng)大的現(xiàn)代Java IDE,它們每天使我的生活變得更輕松,但是了解如何在沒有它們的情況下構(gòu)建和運行簡單的Java示例也有很多好處。 這篇文章著重于如何做到這一點。
在我的博客文章“ 通過簡單測試學(xué)習(xí)Java”中 ,我寫了一些我有時喜歡使用簡單的文本編輯器和命令行工具來編寫,構(gòu)建和運行簡單應(yīng)用程序的方式。 我現(xiàn)在有一個很好的主意,我最喜歡的Java IDE需要多少“開銷”,并盡早決定使用IDE獲得的好處是否足以保證“開銷”。 在大多數(shù)實際應(yīng)用程序中,毫無疑問,IDE“開銷”是值得的。 但是,對于最簡單的示例應(yīng)用程序,并非總是如此。 本文的其余部分顯示了在這些情況下如何在沒有IDE的情況下構(gòu)建和運行Java代碼。
要構(gòu)建和執(zhí)行的Java代碼
為了使本文的討論更加具體,我將使用一些非常簡單的Java類,這些Java類通過組合或繼承相互關(guān)聯(lián),并且位于相同名稱的包中(而不是未命名的包中 ),稱為dustin.examples 。 其中兩個類沒有main函數(shù),而第三個類Main.java確實具有一個main函數(shù),以允許演示如何在沒有IDE的情況下運行該類。 接下來顯示這三個類的代碼清單。
Parent.java
package dustin.examples;public class Parent {@Overridepublic String toString(){return "I'm the Parent.";} }Child.java
package dustin.examples;public class Child extends Parent {@Overridepublic String toString(){return "I'm the Child.";} }Main.java
package dustin.examples;import static java.lang.System.out;public class Main {private final Parent parent = new Parent();private final Child child = new Child();public static void main(final String[] arguments){final Main instance = new Main();out.println(instance.parent);out.println(instance.child);} }下一個屏幕快照顯示了具有這些類.java源文件的目錄結(jié)構(gòu)。 屏幕快照顯示了源文件在表示包名稱的目錄層次結(jié)構(gòu)中(由于使用dustin.examples因此使用了dustin.examples dustin/examples ),并且反映包的目錄層次結(jié)構(gòu)在名為src的子目錄下。 我還創(chuàng)建了classes子目錄(當(dāng)前為空)來放置已編譯的.class文件,因為javac該目錄不存在時不會創(chuàng)建該目錄。
使用Javac進(jìn)行構(gòu)建并使用Java運行
無論使用哪種方法來構(gòu)建Java代碼(Ant,Maven,Gradle或IDE),它最終都?xì)w結(jié)為javac 。 通過運行javac -help可以看到Oracle / Sun提供的javac 命令行工具的標(biāo)準(zhǔn)選項,而通過運行javac -help -X可以查看其他擴(kuò)展選項。 在Windows或Unix / Linux的 javac的工具文檔中可以找到有關(guān)如何應(yīng)用這些選項的更多詳細(xì)信息。
如javac文檔所述, -sourcepath選項可用于表示源文件所在的目錄。 在上面的屏幕快照中顯示的目錄結(jié)構(gòu)中,這意味著,假設(shè)我正在C:\java\examples\javacAndJava\目錄中運行javac命令,則我的命令中需要具有以下內(nèi)容: javac -sourcepath src src\dustin\examples\*.java 。 下一個屏幕快照顯示了此結(jié)果。
因為我們沒有為.class文件指定目標(biāo)目錄,所以默認(rèn)情況下將它們與編譯它們的源.java文件放在同一目錄中。 我們可以使用-d選項糾正這種情況。 我們的命令現(xiàn)在可以運行,例如,作為javac -sourcepath src -d classes src\dustin\examples\*.java 。 如前所述,指定的目標(biāo)目錄( classes )必須已經(jīng)存在。 完成后,該命令會將.class文件放置在指定的目錄中,如下一個屏幕快照所示。
將Java源文件編譯為指定目錄中的相應(yīng).class文件之后,我們現(xiàn)在可以使用Java應(yīng)用程序啟動器命令行工具java運行該應(yīng)用程序。 只需按照java -help或java工具頁面上顯示的說明并使用-classpath (或-cp )選項指定.class文件的位置即可完成。 在下一個屏幕快照中演示了使用這兩種方法指定classes目錄是查找.class文件的位置。 最后一個參數(shù)是具有要執(zhí)行的main功能的類的標(biāo)準(zhǔn)名稱(整個Java程序包)。 在下一個屏幕快照中演示的命令是java -cp classes dustin.examples.Main和java -classpath classes dustin.examples.Main 。
使用Ant構(gòu)建并運行
對于最簡單的Java應(yīng)用程序,使用javac和java分別構(gòu)建和執(zhí)行該應(yīng)用程序非常簡單,如剛剛演示的那樣。 隨著應(yīng)用程序的參與度提高(例如,存在于多個軟件包/目錄中的代碼或第三方庫和框架上更復(fù)雜的類路徑依賴項),這種方法可能變得笨拙。 Apache Ant是Java構(gòu)建工具“三巨頭 ”中最古老的一種,已在數(shù)千個應(yīng)用程序和部署中使用。 正如我在前一篇博客文章中所討論的那樣 ,很容易創(chuàng)建一個非常基本的Ant構(gòu)建文件,尤其是如果該文件以我在該文章中概述的模板開頭的話。
下一個代碼清單是針對Ant build.xml文件的,該文件可用于將.java文件編譯為.class文件,然后運行dustin.examples.Main類,就像上面對javac和java所做的那樣。
build.xml
<?xml version="1.0" encoding="UTF-8"?> <project name="BuildingSansIDE" default="run" basedir="."><description>Building Simple Java Applications Without An IDE</description><target name="compile"description="Compile the Java code."><javac srcdir="src"destdir="classes"debug="true"includeantruntime="false" /></target><target name="run" depends="compile"description="Run the Java application."><java classname="dustin.examples.Main" fork="true"><classpath><pathelement path="classes"/></classpath></java></target> </project>我沒有使用過Ant屬性,也沒有包括我通常包含的公共目標(biāo)(例如“ clean”和“ javadoc”),以使該示例盡可能簡單,并使之與使用javac和java的上一個示例保持接近。 還要注意,我為javac Ant任務(wù)包括了將“ debug”設(shè)置為“ true”的原因,因為在Ant的默認(rèn)設(shè)置中它不是true,而在javac的默認(rèn)值中是true。 毫不奇怪,Ant的javac任務(wù)和java任務(wù)與命令工具javac和java非常相似。
因為我使用了未明確指定構(gòu)建文件的Ant期望的默認(rèn)名稱( build.xml ),并且因為我將“運行”目標(biāo)作為該構(gòu)建文件的“默認(rèn)”,并且因為我將“編譯”作為依賴項,要運行“運行”目標(biāo),并且由于Ant在我環(huán)境的路徑上,因此我需要在命令行上執(zhí)行以使Ant編譯并運行該示例的所有操作是在帶有build.xml文件的目錄中鍵入“ ant”。 下一個屏幕快照對此進(jìn)行了演示。
盡管我演示了如何使用Ant編譯和運行簡單的Java應(yīng)用程序,但是我通常僅使用Ant編譯并使用java (或者如果類路徑令人討厭的話,會調(diào)用java的腳本)運行。
使用Maven構(gòu)建和運行
盡管Ant是第一個主流的Java構(gòu)建工具,但是Apache Maven最終獲得了自己的顯著成就,這在很大程度上要歸功于它采用了約定的配置方式以及對庫的通用存儲庫的支持。 當(dāng)代碼和生成的對象符合其標(biāo)準(zhǔn)目錄布局時,Maven最容易使用。 不幸的是,我的示例沒有遵循此目錄結(jié)構(gòu),但是Maven允許我們覆蓋預(yù)期的默認(rèn)目錄結(jié)構(gòu) 。 下一個代碼清單是針對Maven POM文件的,該文件將覆蓋源目錄和目標(biāo)目錄,并為使用Maven 3.2.1的Maven構(gòu)建提供其他最低要求的元素。
pom.xml
<project><modelVersion>4.0.0</modelVersion><groupId>dustin.examples</groupId><artifactId>CompilingAndRunningWithoutIDE</artifactId><version>1</version><build><defaultGoal>compile</defaultGoal><sourceDirectory>src</sourceDirectory><outputDirectory>classes</outputDirectory><finalName>${project.artifactId}-${project.version}</finalName></build> </project>因為上面的pom.xml文件將“ defaultGoal”指定為“ compile”,并且因為pom.xml是Maven可執(zhí)行文件(mvn)查找的默認(rèn)自定義POM文件,并且因為Maven安裝的bin目錄在我的路徑上,所以我只需要運行“ mvn”來編譯.class文件,如下一個屏幕快照所示。
我還可以使用命令mvn exec:java -Dexec.mainClass=dustin.examples.Main使用Maven運行編譯后的應(yīng)用程序,這將在下一個屏幕快照中演示。
與Ant一樣,我通常不使用Maven運行我的簡單Java應(yīng)用程序,而是在編譯后的代碼上使用java (或使用直接為長類路徑調(diào)用java的腳本)。
使用Gradle構(gòu)建和運行
Gradle是三種主要Java構(gòu)建工具中最年輕,最時髦和最時髦的。 有時,我對流行趨勢的實質(zhì)持懷疑態(tài)度,但是我發(fā)現(xiàn)Gradle有很多令人喜歡的地方 (用Groovy而不是XML編寫,內(nèi)置的Ant支持,內(nèi)置的Ivy支持,按約定容易被覆蓋的配置) ,Maven存儲庫支持等)。 下一個示例顯示了一個Gradle構(gòu)建文件,該文件可用于編譯和運行簡單應(yīng)用程序,這是本文的主要示例代碼。 它改編自我在博客文章Simple Gradle Java Plugin Customization中介紹的示例。
build.gradle
apply plugin: 'java' apply plugin: 'application'// Redefine where Gradle should expect Java source files (*.java) sourceSets {main {java {srcDirs 'src'}} }// Redefine where .class files are written sourceSets.main.output.classesDir = file("classes")// Specify main class to be executed mainClassName = "dustin.examples.Main"defaultTasks 'compileJava', 'run'build.gradle文件的前兩行指定Java插件和Application插件的應(yīng)用程序 ,從而自動為該版本帶來了很多功能。 “ sourceSets”和“ sourceSets.main.output.classesDir”的定義允許分別覆蓋Gradle的Java插件的Java源代碼和編譯的二進(jìn)制類的默認(rèn)目錄。 “ mainClassName”允許顯式指定應(yīng)作為Application插件的一部分運行的類。 “ defaultTasks”行通過在命令行中簡單地鍵入“ gradle”來指定要運行的任務(wù):“ compileJava”是Java插件提供的標(biāo)準(zhǔn)任務(wù),“ run”是Application插件提供的標(biāo)準(zhǔn)任務(wù)。 因為我將構(gòu)建文件命名為build.gradle并且因為我指定了默認(rèn)任務(wù)'compileJava'和'run',并且因為我的路徑上有Gradle安裝bin目錄,所以我要做的就是構(gòu)建和運行示例。鍵入“ gradle”,這將在下一個屏幕快照中演示。
即使是最大的懷疑論者也不得不承認(rèn),對于這個簡單的示例,Gradle的構(gòu)建非常巧妙。 它結(jié)合了依靠某些約定和假設(shè)的簡潔性,以及根據(jù)需要覆蓋選擇默認(rèn)值的非常簡單的機(jī)制。 它使用Groovy而不是XML的事實也非常吸引人!
與Ant和Maven一樣,我傾向于僅使用這些工具進(jìn)行構(gòu)建,并且通常直接使用java或調(diào)用java的腳本直接運行已編譯的.class文件。 順便說一句,我通常也將這些.class存檔到運行中的JAR中,但這超出了本文的范圍。
結(jié)論
IDE通常對于構(gòu)建簡單的應(yīng)用程序和示例不是必需的,甚至可能比最簡單的示例值得擁有更多的開銷。 在這種情況下,直接應(yīng)用javac和java來構(gòu)建和運行示例相當(dāng)容易。 隨著示例變得越來越復(fù)雜,諸如Ant,Maven或Gradle之類的構(gòu)建工具變得越來越有吸引力。 許多IDE支持這些構(gòu)建工具的事實意味著,如果在簡單的應(yīng)用程序發(fā)展成為一個成熟的項目時確定需要IDE支持,則開發(fā)人員可以使用在過程中較早創(chuàng)建的構(gòu)建工具過渡到IDE。
翻譯自: https://www.javacodegeeks.com/2014/04/compiling-and-running-java-without-an-ide.html
java 編譯 器 ide
總結(jié)
以上是生活随笔為你收集整理的java 编译 器 ide_在没有IDE的情况下编译和运行Java的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 史诗级进步!iPhone 15系列USB
- 下一篇: java美元兑换,(Java实现) 美元