주어진 디렉토리 아래의 모든 자바 파일을 재귀 적으로 컴파일하는 javac 옵션


127

내 프로젝트에서 Java 파일을 컴파일하기 위해 javac 컴파일러를 사용하고 있습니다. 파일은 다음과 같이 여러 패키지에 분산되어 com.vistas.util, com.vistas.converter, com.vistas.LineHelper, com.current.mdcontect.

이러한 각 패키지에는 여러 Java 파일이 있습니다. 다음과 같이 javac를 사용하고 있습니다.

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

(한 줄로)

너무 많은 경로를 제공하는 대신 컴파일러에게 부모 com 디렉토리의 모든 Java 파일을 재귀 적으로 컴파일하도록 어떻게 요청할 수 있습니까?


2
Ant 또는 Maven과 같은 도구를 실제로 살펴 봐야합니다.
Laurent Pireyn 2011

이 SO 게시물은 유용 할 수 있습니다. stackoverflow.com/questions/864630/…
Gopi 2011

답변:


220

또한 어떤 종류의 빌드 도구 ( Ant 또는 Maven , Ant는 이미 제안되어 있으며 시작하기 더 쉬움) 또는 컴파일을 처리하는 IDE (Eclipse는 조정 전략과 함께 증분 컴파일을 사용하며 그럴 필요조차 없음)를 사용하는 것이 좋습니다. "컴파일" 버튼 을 누르십시오 ).

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 파일을 다운로드하고 수동으로 관리 할 필요가 없으며 대규모 프로젝트를 빌드, 패키징 및 테스트하는 데 더 유용하다는 것을 알았습니다.
  • 단점은 그것이 가파른 학습 곡선을 가지고 있으며, 억제 오류로 같은 메이븐 플러그인 :-) 또 다른 것은 도구의 꽤 많은도 (같은 메이븐 저장소와 작동하는지 경우 SBT 스칼라를 들어, 아이비 개미를 들어, Graddle 그루비의 경우) .

IDE 사용

이제 개발 생산성을 높일 수 있습니다. 몇 가지 오픈 소스 대안 (예 : EclipseNetBeans , 필자는 이전을 선호 함)과 상업용 대안 (예 : IntelliJ)이 있습니다. 매우 인기 있고 강력한 )이 있습니다.

백그라운드에서 프로젝트 빌드를 관리 할 수 ​​있으므로 모든 명령 줄 작업을 처리 할 필요가 없습니다. 그러나 백그라운드에서 실제로 어떤 일 이 발생 하는지 알고있는 경우 항상 유용 하므로 ClassNotFoundException.

추가 참고 사항

대규모 프로젝트의 경우 항상 IDE 빌드 도구 를 사용하는 것이 좋습니다 . 전자는 생산성을 높이고 후자는 프로젝트와 함께 다른 IDE를 사용할 수있게합니다 (예 : Maven은 간단한 mvn eclipse:eclipse명령으로 Eclipse 프로젝트 설명자를 생성 할 수 있음 ). 또한, 한 줄 명령으로 테스트 / 빌드 할 수있는 프로젝트를 갖는 것은 예를 들어 새로운 동료와 지속적인 통합 서버에 쉽게 도입 할 수 있습니다. 케이크 조각 :-)


4
를 사용할 때 javac출력 디렉토리를 지정하는 것이 좋습니다. find -name "*.java" > sources.txt && javac -d bin @sources.txt. 그렇지 않으면 * .class 파일이 소스가있는 디렉토리에 저장됩니다.
Maksim Dmitriev

1
물론 사실입니다. 제 생각에는 누군가를 가지고 놀기 시작했다면 javac,를 사용하여 CLASSPATH코드를 실행 java하는 방법, 실행을위한 루트 폴더가되어야하는 패키지를 처리하는 방법 등의 개념은 일반적으로 명확하지 않습니다. 따라서 출력 디렉토리를 생략했습니다. 어쨌든 제안 해 주셔서 감사합니다!
rlegendi

6
이 문제를 findfind . -name "*.java" > sources.txt.
접하는

@MrDuk "."를 추가하는 것은 무엇입니까? 하다? 현재 디렉토리 내에서 검색하기위한 것입니까?
Brady Sheehan 2015

@BradySheehan 주어진 경로에서 검색을 시작합니다. "." 현재 사전에서 시작 함을 의미합니다. 당신이주의 해야 (OS X에서) 발견에 대한 경로를 지정
크리스

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

잔인하지만 지옥처럼 작동합니다. (작은 프로그램에서만 사용, 절대적으로 효율적이지 않습니다)


1
이 고려 사항을 사용 find ... -print0하고 xargs -0 ...대신 파일 이름의 공백을 중단하지 않으
려면

29

당신의 쉘이 그것을 지원한다면, 이것처럼 작동합니까?

javac com/**/*.java 

쉘은 지원하지 않는 경우 **, 어쩌면

javac com/*/*/*.java

작동합니다 (3 개의 구성 요소가있는 모든 패키지에 대해-어느 정도 조정).


Windows 10의 명령 프롬프트에서이 기능을 사용하려고했습니다. 누군가 Windows 10에서 작동하는지 또는 내가 잘못하고 있는지 확인할 수 있습니까?
Dan

26

전체 프로젝트를 컴파일하려는 일반적인 경우에는 메인 클래스에 javac를 제공하고 필요한 모든 종속성을 컴파일하도록 할 수 있습니다.

javac -sourcepath . path/to/Main.java


매우 간단한 방법, 추가 파일에 의존하지 않음
linquize

이것은 최선와 (나 같은) Ant를 배울 수있는 시간이별로없는 사람들을위한 간단한 하나입니다
함자 Abbad

불행히도 게으르다. Main.java두 번째 파일을 만든 직후에 하지 않을을 터치하지 않으면 컴파일러를 얻을 수 없습니다.
Tom Hawtin-tackline

여기서도 잘 작동하지 않습니다. 일부 종속성은 변경 되어도 재 컴파일되지 않습니다. @ TomHawtin-tackline 나는 전에 메인에서 터치를 시도했지만 아무것도 시도하지 않았습니다. 아마 모든 것을 만지는 것이 필요합니다. 그래도 어색합니다.
mmm

5

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

(저는 xargs를 사용하지 않는 것을 선호합니다. xargs를 분할하고 javac를 여러 번 실행할 수 있기 때문입니다. 각각은 Java 파일의 하위 집합으로, 일부는 동일한 javac 명령 줄에 지정되지 않은 다른 파일을 가져올 수 있습니다)

App.java 진입 점이있는 경우 -sourcepath를 사용하는 이상한 방법이 가장 좋습니다. 가져 오기 종속성에 따라 필요한 다른 모든 Java 파일을 컴파일합니다. 예 :

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

대상 클래스 파일 dir :을 지정할 수도 있습니다 -d target/.


3

이 작업에 매우 적합하고 이해하기 쉽고 잘 문서화되어있는 ant를 사용하여 배우도록 조언합니다 .

build.xml 파일에서 다음과 같은 대상을 정의하기 만하면됩니다.

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

2

다음과 같은 간단한 makefile로 make를 사용하고 있습니다.

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

all : $(classes)

clean :
        rm -f $(classes)

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

소스를 한 번에 하나씩 컴파일하고 필요한 경우에만 다시 컴파일합니다.


1

javac 명령은 재귀 컴파일 프로세스를 따르지 않으므로 명령을 실행할 때 각 디렉토리를 지정하거나 포함 할 디렉토리가있는 텍스트 파일을 제공해야합니다.

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

0

Xcode JNI 프로젝트에서 이것을 사용하여 테스트 클래스를 재귀 적으로 빌드했습니다.

find ${PROJECT_DIR} -name "*.java" -print | xargs javac -g -classpath ${BUILT_PRODUCTS_DIR} -d ${BUILT_PRODUCTS_DIR}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.