사용 사례는 간단합니다. Eclipse를 사용하여 만든 소스 파일을 얻었습니다. 따라서 모든 Java 클래스가 동일한 하위, 형제 또는 상위 폴더에있는 다른 Java 클래스를 참조 할 수있는 깊은 디렉토리 구조가 있습니다.
javac를 사용하여 터미널에서이 모든 것을 어떻게 컴파일합니까?
사용 사례는 간단합니다. Eclipse를 사용하여 만든 소스 파일을 얻었습니다. 따라서 모든 Java 클래스가 동일한 하위, 형제 또는 상위 폴더에있는 다른 Java 클래스를 참조 할 수있는 깊은 디렉토리 구조가 있습니다.
javac를 사용하여 터미널에서이 모든 것을 어떻게 컴파일합니까?
답변:
모든 디렉토리를 알고 있거나 와일드 카드 ..를 사용할 수 있어야합니다.
javac dir1/*.java dir2/*.java dir3/dir4/*.java dir3/dir5/*.java dir6/*src/*.java
javac $(find . -name "*.java")
.
Bash 4+를 사용하면 globstar를 활성화 할 수 있습니다.
shopt -s globstar
그리고
javac **/*.java
당신이 원하는 모든 것이 ( .java
메인 클래스가 의존하지 않는 파일을 컴파일하지 않고) 메인 클래스를 실행 하는 것이라면, 다음을 할 수 있습니다 :
cd <root-package-directory>
javac <complete-path-to-main-class>
또는
javac -cp <root-package-directory> <complete-path-to-main-class>
javac
모든 종속성을 자동으로 해결하고 모든 종속성도 컴파일합니다.
-sourcepath .
옵션을 다음 같은 효과에 대한 기본 파일 이름
find . -type f -name "*.java" | xargs javac
는 2 위 이며이 방법은 전체 앱을 포함하는 단일 기본 메소드 진입 점이있는 경우에만 가능합니다.
나는 Jon 의 제안을 받아들이고 Ant를 사용할 것입니다. 이것은 꽤 복잡한 작업이기 때문입니다.
그러나 터미널에서 모든 것을 한 줄로 가져 오기로 결정했다면 Linux에서는 find 명령을 사용할 수 있습니다 . 말하자면, Foo.java이 Bar.java 후 컴파일됩니다된다는 보장이 없기 때문에하지만 난에도 불구하고, 전혀이하지 않는 것이 좋습니다 Foo
사용 Bar
. 예는 다음과 같습니다.
find . -type f -name "*.java" -exec javac {} \;
모든 클래스가 아직 컴파일되지 않은 경우 기본 하네스 또는 드라이버 클래스 (기본적으로 기본 메서드가 포함 된 클래스)가있는 경우 해당 기본 클래스를 개별적으로 컴파일하면 다른 폴더에 있더라도 대부분의 프로젝트를 컴파일해야합니다. Javac은 종속성 문제를 해결하기 위해 최선을 다할 것입니다.
find_gnu . -type f -name "*.java" | xargs javac
에서는 gnu 버전의 find.exe가 find_gnu.exe로 이름이 바뀌면 사용할 수 있습니다 . msysgit에서 gnu find.exe를 얻었습니다.
for /f "usebackq" %f in (``dir /s /b *.java``) do javac %f
(단일 역 따옴표를 사용 dir /s /b
하지만 제대로 포맷하는 방법을 찾을 수 없습니다).
find
솔루션은 각 Java 클래스를 개별적으로 컴파일하여 매우 느리기 때문에 문제가 있다고 생각합니다 .
다음은 내가 찾은 방법입니다.
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
그러나 이것은 절대 경로를 채울 것입니다. 텍스트 편집기 "모두 바꾸기"를 사용하여 ""(즉, 빈 문자열)로 소스 디렉토리 (끝에 \ 포함)까지 경로를 변경하고 저장합니다.
이미 존재하는 답변은 * .java 파일 자체에만 관심이 있고 빌드에 필요할 수있는 라이브러리 파일로 쉽게 수행하는 방법이 아닙니다.
모든 * .java 파일을 재귀 적으로 가져오고 빌드에 필요한 * .jar 파일을 포함하는 멋진 한 줄 상황은 다음과 같습니다.
javac -cp ".:lib/*" -d bin $(find ./src/* | grep .java)
여기서 bin 파일은 클래스 파일의 대상이며 lib (및 잠재적으로 현재 작업 디렉토리)에는 라이브러리 파일이 포함되며 src 디렉토리와 그 아래에있는 모든 Java 파일이 컴파일됩니다.
이 작업을 계층 적으로 수행하려면 Ant와 같은 것을 사용해야합니다.
http://ant.apache.org/manual/Tasks/javac.html
다음을 포함하는 compile이라는 대상으로 빌드 스크립트를 만들어야합니다.
<javac sourcepath="" srcdir="${src}"
destdir="${build}" >
<include name="**/*.java"/>
</javac>
그러면 다음을 실행하여 모든 파일을 컴파일 할 수 있습니다.
ant compile
또는 프로젝트를 Eclipse로 가져 오면 해당 프로젝트의 모든 소스 파일이 자동으로 컴파일됩니다.