[java] 아무도 make for Java를 사용하지 않는 이유는 무엇입니까?

내가 본 모든 Java 프로젝트는 Maven 또는 Ant를 사용합니다. 그들은 훌륭한 도구이며 거의 모든 프로젝트에서 사용할 수 있다고 생각합니다. 그러나 이제까지 우연히 만들어 ? Java 이외의 다양한 프로젝트에 사용되며 Java를 쉽게 처리 할 수 ​​있습니다. Windows를 사용하는 경우 make.exe를 다운로드해야하지만 Ant 및 Maven에도 JDK가 제공되지 않습니다.

Java와 함께 사용할 때 make에 근본적인 결함이 있습니까? Ant와 Maven이 Java로 작성 되었기 때문입니까?



답변

Make와 Java의 근본적인 문제는 Make가 종속성을 지정한 전제에서 작동 한 다음 해당 종속성을 해결하기위한 규칙입니다.

기본 C에서 “main.c 파일을 main.o 파일로 변환하려면”cc main.c “를 실행하십시오.

Java로 할 수는 있지만 빠르게 배울 수 있습니다.

대부분 javac 컴파일러가 느리게 시작됩니다.

차이점은 다음과 같습니다.

javac Main.java
javac This.java
javac That.java
javac Other.java

javac Main.java This.java That.java Other.java

밤낮입니다.

수백 개의 클래스로 그것을 악화시키고, 그것은 단지 참을 수 없게됩니다.

그런 다음 Java와 디렉토리의 파일 그룹으로 구성되는 경향이 있다는 사실과 C 및 더 평평한 구조를 지향하는 다른 파일과 결합합니다. Make는 파일 계층 작업을 직접적으로 지원하지 않습니다.

또한 Make는 컬렉션 수준에서 오래된 파일을 결정하는 데 좋지 않습니다.

Ant를 사용하면 오래된 파일을 모두 요약 한 다음 한 번에 컴파일합니다. Make는 단순히 각 개별 파일에서 Java 컴파일러를 호출합니다. 이렇게하지 않으면 Make가 작업에 크게 영향을 미치지 않는다는 것을 보여줄 수있는 충분한 외부 도구가 필요합니다.

그렇기 때문에 Ant 및 Maven과 같은 대안이 등장했습니다.


답변

훌륭한 make프로그램은 C 및 C ++와 같이 별도로 컴파일 된 언어를 합리적으로 잘 처리합니다. 모듈을 컴파일하면 #include다른 포함 파일의 텍스트를 가져오고 단일 객체 파일을 출력으로 씁니다. 컴파일러는 객체 파일을 실행 가능한 이진 파일에 바인딩하기위한 별도의 연결 단계가있는 한 번에 하나의 시스템입니다.

그러나 Java에서는 컴파일러가 실제로 가져 오는 다른 클래스를 컴파일 해야합니다 import. Java 소스 코드에서 필요한 모든 종속성을 생성하여 make한 번에 하나씩 올바른 순서로 클래스를 빌드 하는 것을 작성할 수는 있지만 순환 종속성과 같은 경우는 처리하지 않습니다.

Java 컴파일러는 다른 클래스의 컴파일 된 결과를 캐싱하면서 이미 컴파일 된 클래스의 결과에 의존하는 추가 클래스를 컴파일함으로써보다 효율적일 수 있습니다. 이러한 종류의 자동 종속성 평가는 make단독으로 는 불가능합니다 .


답변

이 질문은 잘못된 가정에 근거합니다. 사소한 수의 개발자 사용 make합니다. Java 빌드 도구 : Ant vs. Maven을 참조하십시오 . 왜 개발자 사용 하지 않는지에 관해서는 make: 많은 개발자들이 make그것을 사용 하지 않았 거나 그것을 사용하여 1000 태양보다 더 뜨거워지는 불로 그것을 미워했습니다. 따라서 대체 도구를 사용합니다.


답변

실제로 make는 모든 오래된 Java 파일 중 하나의 명령으로 재 컴파일을 처리 할 수 ​​있습니다. 디렉토리의 모든 파일을 컴파일하지 않거나 특정 순서를 원하면 첫 번째 줄을 변경하십시오 …

JAVA_FILES:=$(wildcard *.java)
#
# the rest is independent of the directory
#
JAVA_CLASSES:=$(patsubst %.java,%.class,$(JAVA_FILES))

.PHONY: classes
LIST:=

classes: $(JAVA_CLASSES)
        if [ ! -z "$(LIST)" ] ; then \
                javac $(LIST) ; \
        fi

$(JAVA_CLASSES) : %.class : %.java
        $(eval LIST+=$$<)


답변

각각의 기술적 장점에 대한 다른 모든 대답은 사실입니다. Ant그리고 Maven더 나은 메이크업보다 자바에 적합, 또는 행크 게이가 지적 하듯, 그들은하지 않을 수 있습니다 할 수있다 :

그러나 Ant와 Maven이 Java로 작성된 것이 중요한지 물었습니다. StackOverflow에서 우리는 그러한 생각 (닫힌! 프로그래밍과 관련이 없습니다! 등)을 고려하지 않습니다. 과정의 일부입니다. 레일에서는 Rake를 사용하고 C는 make를 사용하고 Java에서는 Ant와 Maven을 사용합니다. Ant 또는 Maven 개발자가 다른 개발자보다 Java 개발자를 더 잘 돌보는 것은 사실이지만, 또 다른 질문이 있습니다. Ant 태스크를 어떻게 작성합니까? 자바. Java 개발자라면 쉽게 맞을 수 있습니다.

예, 툴링 언어로 작성된 툴을 사용하는 것입니다.


답변

Ant와 이후 Maven은 Make(프로세스에서 새로운 두통 을 만드는 동안) 발생하는 두통을 해결하도록 설계되었습니다 . 그것은 단지 진화 일뿐입니다.

… 그 후, 여러 오픈 소스 Java 프로젝트가 Ant가 Makefile과 관련된 문제를 해결할 수 있다는 것을 깨달았습니다.

에서 http://ant.apache.org/faq.html#history

그들이 무언가를 해결하거나 배우기 위해 여분의 형식을 만들지 여부는 주관적인 주제입니다. 진실은 모든 새로운 발명의 역사와 거의 같습니다. 제작자는 많은 문제를 해결하고 원래의 사용자는 이것이 미덕이라고 말합니다.

그것이 가진 주요 장점은 자바와 통합 할 수 있다는 것입니다.

rake예를 들어 비슷한 역사가있을 것입니다 .


답변

메이븐 (및 아이비 가능 앤트 설정)이 메이크를 통해 해결 한 주요 문제 중 하나는 자동 의존성 해결 및 의존성 jar 다운로드입니다.