簡體   English   中英

javac選項遞歸編譯給定目錄下的所有java文件

[英]javac option to compile all java files under a given directory recursively

我正在使用 javac 編譯器在我的項目中編譯 java 文件。 這些文件分布在多個包中,如下所示: com.vistas.utilcom.vistas.convertercom.vistas.LineHelpercom.current.mdcontect

這些軟件包中的每一個都有幾個 java 文件。 我像這樣使用 javac:

javac com/vistas/util/*.java com/vistas/converter/*.java
      com.vistas.LineHelper/*.java com/current/mdcontect/*.java

(一行)

與其給出這么多路徑,不如讓編譯器遞歸編譯父 com 目錄中的所有 java 文件?

I would also suggest using some kind of build tool ( Ant or Maven , Ant is already suggested and is easier to start with) or an IDE that handles the compilation (Eclipse uses incremental compilation with reconciling strategy, and you don't even have to注意按任何“編譯”按鈕)。

使用 Javac

如果您需要為更大的項目嘗試一些東西並且附近沒有任何合適的構建工具,您總是可以使用javac提供的一個小技巧:可以在文件中指定要編譯的類名。 您只需將文件名以@前綴傳遞給javac

如果您可以創建項目中所有*.java文件的列表,這很容易:

# Linux / MacOS
$ find -name "*.java" > sources.txt
$ javac @sources.txt

:: Windows
> dir /s /B *.java > sources.txt
> javac @sources.txt
  • 優點是這是一個快速簡便的解決方案。
  • 缺點是每次創建新源或重命名現有文件時都必須重新生成sources.txt文件,這很容易忘記(因此容易出錯)和令人厭煩的任務。

使用構建工具

從長遠來看,最好使用專為構建軟件而設計的工具。

使用 Ant

如果您創建一個描述如何構建軟件的簡單build.xml文件:

<project default="compile">
    <target name="compile">
        <mkdir dir="bin"/>
        <javac srcdir="src" destdir="bin"/>
    </target>
</project>

您可以通過運行以下命令來編譯整個軟件:

$ ant
  • 優點是您使用的是易於擴展的標准構建工具。
  • 缺點是您必須下載、設置和學習額外的工具。 請注意,大多數 IDE(如 NetBeans 和 Eclipse)都為編寫構建文件提供了很好的支持,因此在這種情況下您無需下載任何內容。

使用 Maven

Maven 的設置和使用並不是那么簡單,但學習它是值得的。 這是一個很棒的教程,可以在 5 分鍾內啟動一個項目

  • 它的主要優點(對我來說)是它也可以處理依賴關系,因此您無需下載任何 Jar 文件並手動管理它們,我發現它對於構建、打包和測試更大的項目更有用。
  • The drawback is that it has a steep learning curve, and if Maven plugins like to suppress errors:-) Another thing is that quite a lot of tools also operate with Maven repositories (like Sbt for Scala, Ivy for Ant, Graddle for Groovy) .

使用 IDE

現在,什么可以提高您的開發效率。 有一些開源替代品(例如EclipseNetBeans ,我更喜歡前者)甚至是商業替代品(例如IntelliJ ),它們非常流行且功能強大。

他們可以在后台管理項目構建,因此您不必處理所有命令行內容。 但是,如果您知道后台實際發生的情況,它總是會派上用場,這樣您就可以尋找偶爾出現的錯誤,例如ClassNotFoundException

附加說明

對於較大的項目,始終建議使用 IDE構建工具。 The former boosts your productivity, while the latter makes it possible to use different IDEs with the project (eg, Maven can generate Eclipse project descriptors with a simple mvn eclipse:eclipse command). 此外,擁有一個可以使用單行命令測試/構建的項目很容易介紹給新同事和持續集成服務器。 小菜一碟:-)

find . -name "*.java" -print | xargs javac 

有點殘酷,但像地獄一樣工作。 (只在小程序上使用,絕對沒有效率)

在您想要編譯整個項目的通常情況下,您可以簡單地為您的主要 class 提供 javac 並讓它編譯所有必需的依賴項:

javac -sourcepath. path/to/Main.java

如果您的 shell 支持它,這樣的東西會起作用嗎?

javac com/**/*.java 

如果您的 shell 不支持** ,那么也許

javac com/*/*/*.java

有效(適用於具有 3 個組件的所有軟件包 - 或多或少地適應)。

javac -cp "jar_path/*" $(find. -name '*.java')

(我不喜歡使用 xargs,因為它可以將它們拆分並多次運行 javac,每個文件都有 java 文件的子集,其中一些可能會導入未在同一 javac 命令行上指定的其他文件)

如果您有 App.java 入口點,最好使用 -sourcepath 的方式。 它按照導入依賴項編譯它需要的所有其他 java 文件。 例如:

javac -cp "jar_path/*" -sourcepath src/ src/com/companyname/modulename/App.java

您還可以指定目標類文件目錄: -d target/

我只是將 make 與一個簡單的 makefile 一起使用,如下所示:

JAVAC = javac -Xlint:unchecked
sources = $(shell find . -type f -name '*.java')
classes = $(sources:.java=.class)

all : $(classes)

clean :
        rm -f $(classes)

%.class : %.java
        $(JAVAC) $<

它一次編譯一個源,並且僅在必要時重新編譯。

我建議您學習使用ant ,它非常適合這項任務,並且非常容易掌握並且有據可查。

您只需要在 build.xml 文件中定義這樣的目標:

<target name="compile">
    <javac srcdir="your/source/directory"
           destdir="your/output/directory"
           classpath="xyz.jar" />
</target>

javac 命令不遵循遞歸編譯過程,因此您可以在運行命令時指定每個目錄,或者提供包含要包含的目錄的文本文件:

javac -classpath "${CLASSPATH}" @java_sources.txt

這個非常酷:我位於項目根目錄。

find . -name *.java -exec javac {} -d ../out \;

我一直在 Xcode JNI 項目中使用它來遞歸地構建我的測試類:

find ${PROJECT_DIR} -name "*.java" -print | xargs javac -g -classpath ${BUILT_PRODUCTS_DIR} -d ${BUILT_PRODUCTS_DIR}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM