왜 아무도 자바용 make를 사용하지 않는 거죠?
내가 본 자바 프로젝트들은 거의 모두 Maven이나 Ant를 사용한다.그것들은 훌륭한 도구이며, 저는 어떤 프로젝트에서도 사용할 수 있다고 생각합니다.하지만 대체 무슨 일이 있었던 걸까?Java 이외의 다양한 프로젝트에 사용되며 Java를 쉽게 처리할 수 있습니다.물론 당신은 make를 다운로드 받아야 합니다.Windows 를 사용하는 경우는 exe 를 사용할 수 있습니다만, Ant 및 Maven 에는 JDK 가 포함되어 있지 않습니다.
Java와 함께 사용하면 make에 근본적인 결함이 있습니까?Ant와 Maven이 Java로 쓰여져 있기 때문인가요?
Make 및 Java의 근본적인 문제는 Make가 종속성을 지정하고 그 종속성을 해결하기 위한 규칙을 지정하는 것을 전제로 작동한다는 것입니다.
일반적으로 "main.c 파일을 main.o 파일로 변환하려면 "cc main.c"를 실행합니다.
자바에서는 할 수 있지만 금방 배울 수 있는 게 있어요.
대부분 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가 작업을 제대로 수행하지 못한다는 것을 보여줄 수 있는 충분한 외부 공구가 필요합니다.
그래서 앤트와 메이븐과 같은 대안들이 생겨난 것이다.
고귀한 사람make
프로그램은 C와 C++와 같이 따로 컴파일된 언어를 상당히 잘 처리합니다.모듈을 컴파일하면#include
다른 include 파일의 텍스트를 가져와 출력으로 단일 개체 파일을 씁니다.컴파일러는 오브젝트 파일을 실행 가능한 바이너리로 바인드하기 위한 별도의 링크 단계가 있는 거의 한 번에 하나의 시스템입니다.
단, Java에서는 컴파일러는 실제로 Import한 다른 클래스를 컴파일해야 합니다.import
자바 소스 코드에서 필요한 의존성을 모두 생성하는 것을 쓸 수 있지만,make
한 번에 올바른 순서로 클래스를 구축하지만 순환 의존관계 등의 사례를 처리하지 못합니다.
Java 컴파일러는 다른 클래스의 컴파일 결과를 캐싱하고 이미 컴파일된 클래스의 결과에 의존하는 추가 클래스를 컴파일함으로써 더 효율적일 수도 있습니다.이러한 종류의 자동 의존성 평가는 실제로 다음과 같은 방법으로 가능하지 않습니다.make
홀로.
실제로 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+=$$<)
이 질문은 잘못된 가정에 근거하고 있습니다.단순하지 않은 수의 개발자들이make
. "Java 빌드 툴: 개미 vs"를 참조하십시오. 메이븐. 개발자가 왜 이 제품을 사용하지 않는지에 대해서는make
: 많은 개발자가 한 번도 사용하지 않았거나make
또는 그것을 사용하고 천 개의 태양보다 더 뜨겁게 타는 불과 함께 그것을 싫어했다.따라서 대체 도구를 사용합니다.
각각의 기술적 장점에 대한 다른 모든 답변은 사실이다. Ant
그리고.Maven
제조보다 Java에 더 적합할 수도 있고 Hank Gay가 지적한 바와 같이 그렇지 않을 수도 있습니다.
하지만 당신은 Ant와 Maven이 Java로 작성되는 것이 중요한지 물었습니다.StackOverflow에서는 이러한 생각(폐쇄형! 프로그래밍 관련 없음 등)을 고려하지 않습니다.물론 레일에서는 Rake를 사용하고, Cdudes는 make를 사용하고, Java에서는 Ant와 Maven을 사용합니다.Ant 또는 Maven 개발자가 Java 개발자를 다른 개발자들보다 더 잘 돌본다는 것은 사실이지만, 또 다른 질문이 있습니다: Ant 태스크는 무엇으로 작성합니까?자바. 자바 개발자라면 쉽게 맞겠네요.
따라서 툴링 중인 언어로 작성된 툴을 사용하는 것도 그 중 하나입니다.
Ant와 이후 Maven은 다음과 같은 몇 가지 두통을 해결하도록 설계되었습니다.Make
(그 과정에서 새로운 것을 창조하는 동안) 그것은 단지 진화일 뿐이다.
...그 후, 몇개의 오픈 소스 Java 프로젝트가 Ant가 Makefiles의 문제를 해결할 수 있다는 것을 깨달았습니다.
http://ant.apache.org/faq.html#history 에서
그들이 어떤 것을 해결하든, 아니면 단지 배울 수 있는 추가 형식을 만들든 그것은 주관적인 주제이다.사실 모든 새로운 발명품의 역사는 이와 거의 비슷합니다.창작자는 많은 문제를 해결한다고 하고, 원작자들은 그것이 미덕이라고 말한다.
이 제품의 주요 장점은 자바와의 통합 가능성입니다.
비슷한 역사가 있을 것 같은데rake
예를 들어.
메이븐(및 Ivy 대응 Ant 셋업)이 제조에 대해 해결한 주요 문제 중 하나는 의존관계 자동 해결 및 의존관계 jar 다운로드입니다.
단답: 이유make
좋지 않아요C 전선에서조차 많은 대안이 나타납니다.
장황한 답변:make
에는 몇 가지 결함이 있어 C 컴파일에는 거의 적합하지 않으며 Java 컴파일에는 전혀 적합하지 않습니다.필요에 따라 Java를 컴파일하도록 강제할 수 있지만 적절한 솔루션이나 회피책이 없는 문제가 발생할 것으로 예상할 수 있습니다.다음은 몇 가지 예입니다.
의존관계 해결
make
에서는 본질적으로 파일이 서로에 대한 트리 같은 종속성을 가지며, 여기서 하나의 파일은 다른 여러 개의 파일을 빌드할 때의 출력입니다.이것은 헤더 파일을 처리할 때 이미 C에서 역효과를 일으킵니다. make
에는 「」가 합니다.make
은 헤더 C 위해 하면 가 specific include file은 C 파일입니다.따라서 후자를 변경하면 이전 파일이 재구축됩니다.는 재작성 재구축 않기 에 C파일에서는 을 「」으로 가 있는 경우가 ..PHONY
다행히 GCC는 이러한 파일의 자동 생성을 지원합니다.
일 수 Java에서는 클래스 를 자동 .make
맷합니니다다ant
의 »Depend
대신 태스크는 클래스 파일을 직접 읽고 가져올 클래스를 결정하고 오래된 클래스 파일이 있으면 해당 클래스 파일을 삭제할 수 있습니다.이렇게 하지 않으면 중요하지 않은 종속성으로 인해 반복적인 클린 빌드를 사용해야 하므로 빌드 도구를 사용하는 이점이 없어질 수 있습니다.
파일 이름의 공백
이름에 하지 않지만 C도 공백 사용을 권장하지 않습니다.make
공백이 파일 경로에 있더라도 문제가 될 수 있습니다.가 「소스코드」에 「소스코드」가 됩니다.C:\My Documents\My Code\program\src
이 정도면 깨질 것 같아make
은 ★★★★★★에 의한 것입니다.make
는 파일명을 문자열로 취급합니다. ant
는 경로를 특별한 개체로 처리합니다.
빌드를 위해 파일 검색
make
에서는, 각 타겟에 대해서 빌드 하는 파일을 명시적으로 설정할 필요가 있습니다. ant
그럼 소스 파일에 대해 자동 검색되는 폴더를 지정할 수 있습니다.사소한 편의처럼 보일 수 있지만 Java에서는 새 클래스마다 새 파일이 필요하다는 점을 고려하십시오.프로젝트에 파일을 추가하는 것은 매우 번거로운 일이 될 수 있습니다.
가장 큰 은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★make
:
make는 POSIX에 의존합니다.
Java의 모토는 "compile once run here"입니다.그러나 이 컴파일을 Java 지원이 사실상 최악인 POSIX 기반 시스템으로 제한하는 것은 의도가 아닙니다.
「 」로 합니다.make
으로 작다bash
포트는 요.make
, 「」, 「」에 되어 가 있습니다.bash
포식스
여기에는 두 가지 종류가 있습니다.
MSYS
POSIX 변환을 파일 경로로 제한하려고 하기 때문에 특별히 작성되지 않은 외부 도구를 실행할 때 불쾌한 gotch가 발생할 수 있습니다.cygwin
포식스그러나 결과 프로그램은 여전히 에뮬레이션 계층에 의존하는 경향이 있습니다.
때문에,에서는, 표준 툴은 「 」, 「 」, 「 」, 「 」도 아닙니다.make
오히려MSBuild
툴은 툴이기도 으로 XML에 툴입니다.ant
.
반대로ant
는 Java에서 구축되어 어디서나 실행할 수 있으며 플랫폼에 의존하지 않는 방식으로 파일을 조작하고 명령을 실행하기 위한 "태스크"라고 불리는 내부 도구를 포함하고 있습니다.이것은 충분히 다용도이므로 실제로 Windows에서 C 프로그램을 만드는 데 시간을 더 쉽게 사용할 수 있습니다.ant
사용하는 것보다make
.
그리고 마지막 한 가지 사소한 것:
C프로그램도 make를 네이티브로 사용하지 않는다.
처음에는 눈치채지 못할 수도 있지만, 일반적으로 C프로그램은 C프로그램이 포함되어 있지 않습니다.Makefile
. 이 제품들은CMakeLists.txt
, 또는bash
컨피규레이션스크립트: 실제의 설정 스크립트를 생성합니다.Makefile
이와는 대조적으로, 자바 프로그램의 소스는ant
에 동봉되어 있습니다.ant
스크립트 사전 작성.aMakefile
다른 도구의 산물입니다.-그 정도예요.make
자체 빌드 툴로는 적합하지 않습니다. ant
는 스탠드아론이며 추가 요건이나 의존관계 없이 Java 빌드 프로세스에 필요한 모든 것을 처리합니다.
달릴 때ant
어떤 플랫폼에서도 동작합니다(tm).그런 건 할 수 없어요make
플랫폼과 구성에 의존합니다.
스크립트는 본질적으로 플랫폼에 의존하는 경향이 있습니다.Java는 플랫폼에 의존하지 않습니다.따라서 멀티플랫폼 소스베이스에 대해 하나의 플랫폼에서만 동작하는 빌드 시스템을 갖추는 것은 문제가 됩니다.
가장 가능성이 높은 설명은 몇 가지 요인이 자바 커뮤니티 내에서 중요한 시기(1990년대 후반)에 제조를 사용하는 것을 방해했다는 것입니다.
- Java는 여러 플랫폼을 포괄하기 때문에 Java 프로그래머는 일반적으로 Unix 환경(예: C 및 Perl 프로그래머)에 국한된 프로그래머만큼 Unix 툴에 능숙하지 않았습니다.이 값은 일반 값입니다.의심할 여지 없이 Unix에 대한 깊은 이해를 가진 Java 프로그래머들이 있고 또 그럴 수 있었다.
- 결과적으로 그들은 만드는 데 능숙하지 못했고 효과적으로 사용하는 방법을 알지 못했다.
- Java를 효율적으로 컴파일하는 짧고 간단한 Makefile을 작성하는 것은 가능하지만 플랫폼에 의존하지 않는 방법으로 작성하려면 각별한 주의가 필요합니다.
- 그 결과 본질적으로 플랫폼에 의존하지 않는 빌드 툴에 대한 수요가 있었습니다.
- 이러한 환경에서 앤트와 이후 메이븐이 탄생했습니다.
한마디로 make는 Java 프로젝트에서 가장 확실하게 사용될 수 있지만, 사실상의 Java 빌드 툴로 만들 수 있는 기회가 있었습니다.그 순간은 지나갔습니다.
내가 아닌 이상 아무도 java를 make for java로 잘못 사용하고 있지 않다는 가정은 잘못된 것입니다.
"Managing Projects with GNU Make" (GFDL에서 이용 가능)에는 사용 전용 장 전체가 포함되어 있습니다.make
java 프로젝트와 함께.
여기에는 다른 도구 대신 make를 사용하는 장단점이 긴 목록이 포함되어 있으므로 살펴보시는 것이 좋습니다.(http://oreilly.com/catalog/make3/book/) 참조).
Ant는 Makefiles보다 XML 구성 지향적인 개선점이고, Maven은 Ant보다 종속성 빌드 도구 개선점입니다.이 세 가지를 모두 사용하는 프로젝트도 있습니다.JDK 프로젝트에서는 makefile과 ant를 혼용했던 것 같아요.
한 가지 큰 이유는 Ant와 Maven(및 대부분의 Java 대상 SCM, CI 및 IDE 툴)이 Java 개발자를 위해 Java로 작성되기 때문입니다.이것에 의해, 개발 환경에의 통합이 간단하게 되어, IDE 서버나 CI 서버등의 다른 툴에서도, 빌드/도입 인프라스트럭처내에 ant/maven 라이브러리의 일부를 통합할 수 있습니다.
옛날에 나는 gmake를 사용한 자바 프로젝트를 했다.제 기억은 희미하지만 IIRC는 javac이 기대하는 패키지 디렉토리 구조를 다루는데 어려움을 겪었습니다.JAR 파일을 작성하는 것은 사소한 일이 아니면 번거로웠던 것으로 기억합니다.
ApacheAnt는 Make와 전혀 다릅니다.Make는 파일 간의 종속성과 파일 빌드 방법을 설명하는 것입니다.Ant는 "태스크" 간의 종속성에 대한 것이며 빌드 스크립트를 함께 결합하는 방법에 가깝습니다.
AntVsMake에 도움이 될 수 있습니다.
Ant와 Maven은 보다 '현대적인' 관점에서 빌드 의존성 그래프와 그 관리에 접근합니다.하지만 오스카가 말했듯이, 그들은 제작으로 오래된 문제들을 해결하려고 노력하면서 그들만의 문제를 만들었다.
GNU Make for Java 프로젝트를 사용한 적은 없지만 jmk를 사용한 적이 있습니다.안타깝게도 2002년 이후로 업데이트되지 않았습니다.
Java 고유의 기능이 몇 가지 있지만 크기를 크게 늘리지 않고 소스 tarball에 포함할 수 있을 정도로 작았습니다.
요즘은 코드를 공유하는 자바 개발자라면 누구나 Ant가 설치되어 있다고 생각합니다.
언급URL : https://stackoverflow.com/questions/2209827/why-is-no-one-using-make-for-java
'source' 카테고리의 다른 글
Java 스택트레이스 덤프 표시 행 수를 늘리려면 어떻게 해야 하나요? (0) | 2022.12.12 |
---|---|
Panda DataFrame에서 열 삭제 (0) | 2022.12.12 |
#1146 - 테이블 'phpmyadmin.pma__tracking'이 존재하지 않습니다.수동으로 비활성화하려면 어떻게 해야 합니까? (0) | 2022.12.12 |
MySQL에서 이미지 BLOB를 표시하는 PHP (0) | 2022.12.12 |
javascript 함수는 bang! 구문을 유도합니다. (0) | 2022.12.12 |