[java] 주어진 디렉토리 아래의 모든 자바 파일을 재귀 적으로 컴파일하는 javac 옵션
내 프로젝트에서 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 파일을 재귀 적으로 컴파일하도록 어떻게 요청할 수 있습니까?
답변
또한 어떤 종류의 빌드 도구 ( 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 사용
이제 개발 생산성을 높일 수 있습니다. 몇 가지 오픈 소스 대안 (예 : Eclipse 및 NetBeans , 필자는 이전을 선호 함)과 상업용 대안 (예 : IntelliJ)이 있습니다. 매우 인기 있고 강력한 )이 있습니다.
백그라운드에서 프로젝트 빌드를 관리 할 수 있으므로 모든 명령 줄 작업을 처리 할 필요가 없습니다. 그러나 백그라운드에서 실제로 어떤 일 이 발생 하는지 알고있는 경우 항상 유용 하므로 ClassNotFoundException
.
추가 참고 사항
대규모 프로젝트의 경우 항상 IDE 및 빌드 도구 를 사용하는 것이 좋습니다 . 전자는 생산성을 높이고 후자는 프로젝트와 함께 다른 IDE를 사용할 수있게합니다 (예 : Maven은 간단한 mvn eclipse:eclipse
명령으로 Eclipse 프로젝트 설명자를 생성 할 수 있음 ). 또한, 한 줄 명령으로 테스트 / 빌드 할 수있는 프로젝트를 갖는 것은 예를 들어 새로운 동료와 지속적인 통합 서버에 쉽게 도입 할 수 있습니다. 케이크 조각 🙂
답변
find . -name "*.java" -print | xargs javac
잔인하지만 지옥처럼 작동합니다. (작은 프로그램에서만 사용, 절대적으로 효율적이지 않습니다)
답변
당신의 쉘이 그것을 지원한다면, 이것처럼 작동합니까?
javac com/**/*.java
쉘은 지원하지 않는 경우 **
, 어쩌면
javac com/*/*/*.java
작동합니다 (3 개의 구성 요소가있는 모든 패키지에 대해-어느 정도 조정).
답변
전체 프로젝트를 컴파일하려는 일반적인 경우에는 메인 클래스에 javac를 제공하고 필요한 모든 종속성을 컴파일하도록 할 수 있습니다.
javac -sourcepath . path/to/Main.java
답변
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/
.
답변
이 작업에 매우 적합하고 이해하기 쉽고 잘 문서화되어있는 ant를 사용하여 배우도록 조언합니다 .
build.xml 파일에서 다음과 같은 대상을 정의하기 만하면됩니다.
<target name="compile">
<javac srcdir="your/source/directory"
destdir="your/output/directory"
classpath="xyz.jar" />
</target>
답변
다음과 같은 간단한 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) $<
소스를 한 번에 하나씩 컴파일하고 필요한 경우에만 다시 컴파일합니다.