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


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.