자바 : 코드의 전체 디렉토리 구조를 어떻게 컴파일 할 수 있습니까?


84

사용 사례는 간단합니다. Eclipse를 사용하여 만든 소스 파일을 얻었습니다. 따라서 모든 Java 클래스가 동일한 하위, 형제 또는 상위 폴더에있는 다른 Java 클래스를 참조 할 수있는 깊은 디렉토리 구조가 있습니다.

javac를 사용하여 터미널에서이 모든 것을 어떻게 컴파일합니까?


궁금해서 Windows, Linux, Mac 등 어떤 OS를 사용하고 계십니까? 이 질문에 대답하는 데 도움이 수
자크 L

1
몇 년 동안 명령 줄에서 java를 컴파일하지 않았지만 main ()이 포함 된 파일을 javac에 전달하면 모든 종속성이 될 수 있으므로 컴파일해야하는 다른 모든 파일을 검색 할 것이라고 생각합니다. main ()을 포함하는 파일부터 발견되었습니다.
Endophage

답변:


59

모든 디렉토리를 알고 있거나 와일드 카드 ..를 사용할 수 있어야합니다.

javac dir1/*.java dir2/*.java dir3/dir4/*.java dir3/dir5/*.java dir6/*src/*.java

2
나는 그것을 생각했다 : 이름이나 와일드 카드를 사용하여 javac 다음에 모든 .java 파일을 나열하십시오.
euphoria83

52
또는 javac $(find . -name "*.java").
Georg Schölly


40

당신이 원하는 모든 것이 ( .java메인 클래스가 의존하지 않는 파일을 컴파일하지 않고) 메인 클래스를 실행 하는 것이라면, 다음을 할 수 있습니다 :

cd <root-package-directory>
javac <complete-path-to-main-class>

또는

javac -cp <root-package-directory> <complete-path-to-main-class>

javac 모든 종속성을 자동으로 해결하고 모든 종속성도 컴파일합니다.


4
이것은 가장 쉬운 작업 솔루션입니다. 사람들이 좋아하지 않는 이유는 무엇입니까?
Alphaaa

11
아마도 라이브러리 또는 지원 코드에 대한 많은 컴파일 작업이 필요한 모든 종속성에 연결되는 기본 메서드가 없다는 사실을 단순하게 무시하기 때문일 것입니다. 좋은 대답이지만 프레임 워크 / 공개 코드베이스에서 사용하지 않을 것입니다.
Ajax

4
IMHO, 프레임 워크 또는 기타 공공 프로젝트는 일종의 빌드 관리를 사용해야합니다. 이런 종류의 컴파일은 소규모 개인 프로젝트에서만 의미가 있습니다.
svenwltr 2013

@Ajax하지만 이런 경우, 당신은 또한 사용할 수있는 -sourcepath .옵션을 다음 같은 효과에 대한 기본 파일 이름
coderatchet

1
누가 메인이 있다고 말합니까? 4 개의 전원이 없다고 누가 말했습니까? 출력에서 원하는 모든 클래스가 main (META-INF / services 또는 기타 서비스 로딩 기술을 사용하지 않음)에 의해 참조됩니다. 만약 당신이하고있는 모든 것이 메인 테스트라면,이 방법은 괜찮지 만 "주어진 디렉토리에있는 모든 자바 파일을 컴파일"하는 완전한 작업을 처리하지 못한다. 적절한 빌드 시스템은 # 1이고 cli 도구 find . -type f -name "*.java" | xargs javac 는 2 위 이며이 방법은 전체 앱을 포함하는 단일 기본 메소드 진입 점이있는 경우에만 가능합니다.
Ajax

12

나는 Jon 의 제안을 받아들이고 Ant를 사용할 것입니다. 이것은 꽤 복잡한 작업이기 때문입니다.

그러나 터미널에서 모든 것을 한 줄로 가져 오기로 결정했다면 Linux에서는 find 명령을 사용할 수 있습니다 . 말하자면, Foo.java이 Bar.java 후 컴파일됩니다된다는 보장이 없기 때문에하지만 난에도 불구하고, 전혀이하지 않는 것이 좋습니다 Foo사용 Bar. 예는 다음과 같습니다.

find . -type f -name "*.java" -exec javac {} \;

모든 클래스가 아직 컴파일되지 않은 경우 기본 하네스 또는 드라이버 클래스 (기본적으로 기본 메서드가 포함 된 클래스)가있는 경우 해당 기본 클래스를 개별적으로 컴파일하면 다른 폴더에 있더라도 대부분의 프로젝트를 컴파일해야합니다. Javac은 종속성 문제를 해결하기 위해 최선을 다할 것입니다.


1
Windows find_gnu . -type f -name "*.java" | xargs javac에서는 gnu 버전의 find.exe가 find_gnu.exe로 이름이 바뀌면 사용할 수 있습니다 . msysgit에서 gnu find.exe를 얻었습니다.
n611x007

또는 순수 Windows 배치에서 : for /f "usebackq" %f in (``dir /s /b *.java``) do javac %f(단일 역 따옴표를 사용 dir /s /b하지만 제대로 포맷하는 방법을 찾을 수 없습니다).
Matthieu 2014 년

find솔루션은 각 Java 클래스를 개별적으로 컴파일하여 매우 느리기 때문에 문제가 있다고 생각합니다 .
AlikElzin-kilaka

12

다음은 내가 찾은 방법입니다.

1) 다음과 같이 파일 (예 : FilesList.txt)에 상대 경로가있는 파일 목록을 만듭니다 (공백으로 구분하거나 줄로 구분).

foo/AccessTestInterface.java
foo/goo/AccessTestInterfaceImpl.java

2) 다음 명령을 사용하십시오.

javac @FilesList.txt -d classes

이것은 모든 파일을 컴파일하고 클래스 파일을 classes 디렉토리에 넣습니다.

이제 FilesList.txt를 쉽게 만드는 방법은 다음과 같습니다. 소스 루트 디렉터리로 이동합니다.

dir *.java /s /b > FilesList.txt

그러나 이것은 절대 경로를 채울 것입니다. 텍스트 편집기 "모두 바꾸기"를 사용하여 ""(즉, 빈 문자열)로 소스 디렉토리 (끝에 \ 포함)까지 경로를 변경하고 저장합니다.


이 javac의 지원으로, "배치"파일 더 "기본"방법입니다
lovespring

경로에 공백이 있으면 "dir * .java / s / b> FilesList.txt"접근 방식이 작동하지 않습니다. javac는 FilesList.txt에 대해 불평 할 것입니다
aderesh

10

이미 존재하는 답변은 * .java 파일 자체에만 관심이 있고 빌드에 필요할 수있는 라이브러리 파일로 쉽게 수행하는 방법이 아닙니다.

모든 * .java 파일을 재귀 적으로 가져오고 빌드에 필요한 * .jar 파일을 포함하는 멋진 한 줄 상황은 다음과 같습니다.

javac -cp ".:lib/*" -d bin $(find ./src/* | grep .java)

여기서 bin 파일은 클래스 파일의 대상이며 lib (및 잠재적으로 현재 작업 디렉토리)에는 라이브러리 파일이 포함되며 src 디렉토리와 그 아래에있는 모든 Java 파일이 컴파일됩니다.


swagger에 의해 생성 된 클라이언트 소스 코드를 컴파일하는 데 문제가 있습니다
Eenvincible

9

이 작업을 계층 적으로 수행하려면 Ant와 같은 것을 사용해야합니다.

http://ant.apache.org/manual/Tasks/javac.html

다음을 포함하는 compile이라는 대상으로 빌드 스크립트를 만들어야합니다.

<javac sourcepath="" srcdir="${src}"
         destdir="${build}" >
    <include name="**/*.java"/>
</javac>

그러면 다음을 실행하여 모든 파일을 컴파일 할 수 있습니다.

 ant compile

또는 프로젝트를 Eclipse로 가져 오면 해당 프로젝트의 모든 소스 파일이 자동으로 컴파일됩니다.


안타깝게도 이것은 ant를 지원하지 않는 서버에서 수행되어야합니다.
euphoria83 2011 년

2

파이프 문자를 사용하지 않고이 작업을 수행 할 수있는 방법이 있습니다.이 작업을 수행하기 위해 다른 프로그래밍 언어에서 프로세스를 분기하는 경우 편리합니다.

find $JAVA_SRC_DIR -name '*.java' -exec javac -d $OUTPUT_DIR {} +

Bash에 있거나 파이프를 사용해도 괜찮다면 다음을 수행 할 수 있습니다.

find $JAVA_SRC_DIR -name '*.java' | xargs javac -d $OUTPUT_DIR

2

Windows 솔루션 : 하위 디렉토리 'src'에 포함 된 모든 파일을 가정하고이를 'bin'으로 컴파일하려고합니다.

for /r src %i in (*.java) do javac %i -sourcepath src -d bin

src가 바로 아래에 .java 파일을 포함하면 더 빠릅니다.

javac src\\*.java -d bin

1
작동하지만 superslow - javac의이 ... 당신이 그들을 많이 가지고 있으므로 경우에만 호출 당 하나 개의 파일로 호출
St.Shadow
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.