Neden kimse Java için make kullanmıyor?


162

Gördüğüm hemen hemen her Java projesi Maven veya Ant kullanıyor. Bunlar iyi araçlardır ve bence hemen hemen her proje bunları kullanabilir. Peki ne yapacaktı ? Çeşitli Java dışı projeler için kullanılır ve Java'yı kolayca işleyebilir. Elbette, Windows kullanıyorsanız make.exe dosyasını indirmeniz gerekir, ancak Ant ve Maven de JDK ile birlikte gelmez.

Java ile birlikte kullanıldığında bazı temel kusurlar var mı? Bunun nedeni Ant ve Maven'in Java ile yazılmış olması mı?


37
Bir şeyleri hareket ettirir ve derleyiciyi (ve hatta o zaman) çağırmaktan daha fazlasını yaparsanız, platforma özgü şeyler ele almak çok zorlaşır make. Ve sadece tek bir sistemde çalışan bir makefile'a sahip olmak, platformlar arası bir dil için çok hoş değil.
Joey

Bir kenara, Gradle, Java alanında yeni bir oyuncu, Gant (daha az derecede). Maven veya Ant yanlış bir ikiliktir.
Michael Easter

@Michael Easter, yanlış ikilik Maven / Ant vs Make olur. Gerçek ikilik, eğer seni doğru okuyorsam Gradle / Maven / Gant / Ant vs. Make olur. Ama bunu söylemek biraz zor :)
Dan Rosenstark

Yanıtlar:


192

Make ve Java ile ilgili temel sorun, Make'ın bir bağımlılık belirttiğiniz öncül üzerinde ve sonra da bu bağımlılığı çözmek için bir kural üzerinde çalıştığıdır.

Temel C ile, genellikle "main.c dosyasını main.o dosyasına dönüştürmek için" cc main.c "komutunu çalıştırın.

Java'da bunu yapabilirsiniz, ancak hızlı bir şekilde bir şeyler öğrenirsiniz.

Çoğunlukla javac derleyicisinin başlatılması yavaştır.

Arasındaki fark:

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

ve

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

gece gündüz.

Bunu yüzlerce sınıfla daha da şiddetlendirin ve sadece savunulamaz hale geliyor.

Daha sonra, java'nın C ve diğerlerine göre daha düz bir yapıya yönelen dizinlerde dosya grupları olarak organize olma eğilimi ile birleştirirsiniz. Make, dosya hiyerarşileriyle çalışma konusunda doğrudan bir desteğe sahip değildir.

Ayrıca, bir koleksiyon düzeyinde hangi dosyaların güncel olmadığını belirleme konusunda da iyi değildir.

Ant ile geçecek ve güncel olmayan tüm dosyaları toplayacak ve daha sonra bunları tek seferde derleyecektir. Make, her bir dosyada java derleyicisini çağırır. Bunu YAPMAMAK, Make'ın göreve tamamen uygun olmadığını göstermek için yeterli harici araç gerektirir.

Bu yüzden Ant ve Maven gibi alternatifler yükseldi.


6
Yani büyük bir Java projesinde make kullanmak için, tüm değiştirilmiş .java dosyalarının bir listesini tutmak ve daha sonra sonunda javac çağırmak gerekir mi? Bana ideal olandan daha az geliyor. Şimdiye kadar gördüğüm en iyi cevap bu.
Kullanıcı1

32
Bunu seviyorum. Gerekli diyorsunuz ki Ant, javacın çok yavaş olduğu gerçeğini ele almak için gerekliydi.
cmcginty

25
Hayır. Kullanılmak üzere tasarlandığı gibi kullanırsanız Javac yavaş değildir. Bir seferde bir dosya derlemek için kullanırsanız yavaştır.
Stephen C

7
@Casey javac çok yavaş değil. JVM başlatılamayacak kadar yavaş.
Thorbjørn Ravn Andersen

7
GNU Make en azından "hedeften daha yeni olan tüm önkoşullara" genişleyen $?otomatik değişkene sahiptir. Ayrıca, tüm dosyaları güncellemek için tarifi sadece bir kez çalıştıracak birden fazla hedefe sahip desen kurallarının özelliği de vardır .class. Dosyanın bazı akıllı kullanımı ile birleştiren / metin fonksiyonları gibi $(wildcard), $(shell), $(eval)ve dizin düzeni dağılmış yapı hedeflerini keşfetmek için makefile öğretebilir.
Tanz87

33

Saygıdeğer makeprogram, C ve C ++ gibi ayrı olarak derlenmiş dilleri oldukça iyi işler. Bir modülü derlersiniz #include, diğer içerme dosyalarının metnini çekmek için kullanır ve tek bir nesne dosyasını çıktı olarak yazar. Derleyici, nesne dosyalarını yürütülebilir bir ikili dosyaya bağlamak için ayrı bir bağlantı adımına sahip, hemen hemen birer birer sistemdir.

Ancak, Java'da, derleyicinin içe aktardığınız diğer sınıfları derlemesi gerekirimport . Her ne kadar Java kaynak kodundan gerekli tüm bağımlılıkları üreten bir şey yazmak mümkün olsa da, makesınıfları birer birer doğru sırada derleyecek olsa da, bu hala dairesel bağımlılıklar gibi durumları işlemez.

Java derleyicisi, daha önce derlenmiş olanların sonuçlarına bağlı olan diğer sınıfları derlerken diğer sınıfların derlenmiş sonuçlarını önbelleğe alarak da daha verimli olabilir. Bu tür otomatik bağımlılık değerlendirmesi maketek başına gerçekten mümkün değildir .


7
Bu bir markaya karşı javac yanıtı, bir markaya karşı ant / maven cevabı gibi görünmektedir. Cevabınıza dayanarak, neden biri sadece make + javac'ı (javac'a bir seferde bir paket veya "modül" veriyor, bu yüzden dairesel bağımlılıklar yapmaktan gizleniyor)? Karınca veya maven bu yaklaşımdan herhangi bir fayda sağlar mı?
Laurence Gonsalves

1
@Laurence: Javac'a aynı anda tüm bir paketi verebilirsiniz, ancak daha sonra bu paketteki her şeyi yeniden derleyecektir (çünkü yapmasını söylediğiniz budur). Java derleyicisinin oldukça hızlı olduğu doğrudur, ancak bir şeyi değiştirdikten sonra hangi sınıfların yeniden derlenmesi için gereken minimum sınıflar olduğunu belirlemenize izin verirseniz daha da hızlı olur.
Greg Hewgill

Javac'a yalnızca "ana" sınıfınızı derlemesini söyleyin ve sonra otomatik olarak bağımlı olduğu şeyleri oluşturmasını mı söylüyorsunuz? Son kontrol (kuşkusuz, muhtemelen 1.4) bu korkunç güvenilmez. - Xdepend biraz daha iyiydi (ama daha yavaş ve hala kırılmıştı) ve bu bayrağı 1.3'te kaldırdılar.
Laurence Gonsalves

4
Ayrıca, bu hala düz javac yerine Ant veya Maven'i neden kullanacağımı açıklamıyor ...
Laurence Gonsalves

28

Soru yanlış varsayıma dayanmaktadır: geliştiricilerin önemsiz olmayan bir sayı yapmak kullanımını make. Bkz. Java Derleme Araçları: Ant ve Maven . Bir geliştirici neden gelince olmaz kullanmak make: Birçok geliştirici ya hiç kullanmamış makeya kullandım ve bir bin güneş daha yangın olduğu yanıklar Hotter ile nefret ediyordu. Bu nedenle, alternatif araçlar kullanırlar.


10
Bunu kullanıyoruz ve ateş bin bir güneşten daha sıcak.
reccles

4
@reccles: Sadece yapı mühendisliğine mi yoksa kendini yapmaya mı yönelik? Karınca, Maven veya başka bir şey nasıl daha iyi olurdu (yani sınıfı için kötü bir araç mı olur)?
Kullanıcı1

5
@ Kullanıcı1 make, yazıldığı zaman mantıklı olabilecek birçok "özelliğe" sahiptir, ancak şimdi daha çok hataya benzer, örneğin, belirli yerlerde boşluk değil, bir TAB karakteri kullanmalısınız. Bu tür şeyler muhtemelen gerçekten deneyimli insanları rahatsız etmiyor make, ancak geri kalanımız bizi deli ediyor.
Hank Gay

4
@HankGuy: editörünüz bu ayrıntı için endişelensin. Düzenleyiciniz sekme <-> boşluk ayarlarını doğru şekilde işleyemezse, yeni bir düzenleyici edinin ve çok daha mutlu olacaksınız. Ancak, dinamik bağımlılıkların ele alınış şekli gibi birçok özelliğin modası geçmiş olduğunu söylemekte haklısın ( make dependkimse?)
D.Shawley

3
@ User1 Yaptığımız projenin ölçeği. Marka oluşturma ve bağımlılık oluşturma konusunda tam zamanlı bir personelimiz var. Maven kullandıktan sonra daha yönetilebilir buldum. Şimdi maven'in de mükemmel olmadığını söyledikten sonra. Hiçbir şey, öngörülen kurulumdan biraz farklı bir yapı oluşturmak için hangi XML ayarının gerekli olduğunu anlamaya çalışmaktan daha sinir bozucu değildir.
reccles

28

Aslında make, tüm eski java dosyalarının tek bir komutunda yeniden derlemeyi işleyebilir. Dizindeki tüm dosyaları derlemek istemiyorsanız veya belirli bir sipariş istiyorsanız ilk satırı değiştirin ...

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+=$$<)

4
Güzel! Ben böyle bir şey arıyordum. Evrensel klasik iyi çalıştığında her dil için farklı bir oluşturma aracı kullanmaya gerek yoktur. Teşekkürler!
rsp

17

Her birinin teknik değerleriyle ilgili diğer tüm cevaplar doğrudur. Antve Mavendaha iyi yapmak daha Java uygun veya Hank Gay işaret ettiği gibi, onlar olmayabilir edilebilir :)

Ancak Ant ve Maven'in Java ile yazılmış olup olmadığını sordunuz. StackOverflow üzerinde olmasına rağmen biz bu düşünceleri dikkate almıyoruz (kapalı! Programlama ile ilgili değil!), DERSİN ŞEYİN PARÇASI. Raylarda Rake, C dudes make kullanır ve Java'da Ant ve Maven kullanırız. Ant veya Maven geliştiricilerinin Java geliştiricisine belki diğerlerinden daha iyi bakacağı doğru olsa da, başka bir soru daha var: Ant görevlerini ne yazıyorsunuz? Java. Bir Java geliştiricisiyseniz, bu kolay bir seçimdir.

Yani evet, bir kısmı kullandığınız dilde yazılmış araçları kullanmaktır.


7
Ant, Java topluluğunun XML ile delicesine girdiği bir zamanda da ortaya çıktı. (XML'in yeri yoktur demek değildir.)
Laurence Gonsalves

3
@Laurence Gonsalves, bu çok doğru. Ama lütfen, biz burada SO hakkında soluklar hakkında konuşmuyoruz :) O zaman Java dev öğretiyordu ve HER ŞEY XML idi. Şimdi hala XML, ama kimse umursamıyor.
Dan Rosenstark

1
Takım yorumu ilginçtir. makeUNIX arka planından gelir, böylece takım yararlı kompakt yardımcı programlar yazıp bunları bir araya getirerek yapılır. Bu nedenle dikişlerin çoğu kabuk komutları kullanılarak yapılır.
D.Shawley

2
@D. Shawley, hepsi gerçek makeve küçük Unix araçları. GIT de bu sürecin bir çocuğu. Kişisel bir not olarak, daha iyi olmadığını söyleyemem. Ancak Java programcıları için büyük bir paradigma değişimi. Ant, Java düşünce biçimleriyle çok daha uyumludur.
Dan Rosenstark

12

Ant ve daha sonra Maven, Make(süreçte yenilerini oluştururken) neden olduğu bazı baş ağrılarını çözmek için tasarlandı .

... Kısa süre sonra, birkaç açık kaynaklı Java projesi Ant'in Makefiles ile yaşadıkları sorunları çözebileceğini fark etti.

Http://ant.apache.org/faq.html#history adresinden

Bir şeyi çözüp çözmedikleri ya da sadece öğrenmek için fazladan bir format oluşturdukları öznel bir konudur. Gerçek şu ki, hemen hemen her yeni icatın tarihi: Yaratıcı, birçok sorunu çözdüğünü söylüyor ve orijinal kullanıcılar bunun erdemler olduğunu söylüyor.

Sahip olduğu en büyük avantaj, java ile entegre olma olasılığıdır.

rakeÖrneğin benzer bir tarihin de olacağını tahmin ediyorum .


4
Bu çok spesifik değil. Maven markaların neden olduğu baş ağrılarını çözer?
Laurence Gonsalves

1
@Gonsalves: Bu, her yeni teknolojinin öznel yönlerinden biri, alternatifin yaratıcısı birçok sorunu çözdüğünü söylüyor ve değiştirilen teknolojinin yaratıcıları, bunların kusurlar değil erdemler vb. Bu durumda java entegrasyonu ve çapraz derleme kutunun dışında olduğunu düşünüyorum
OscarRyz

2
[Cevap düzenlemenize atıfta bulunarak, en son yorumunuzu değil] Bu hala hangi sorunların çözüldüğünü açıklamıyor, yalnızca içerik oluşturucular ve sorunların çözüldüğünü iddia ediyor ...: - / Benim izlenimim Ant'in Make'a daha basit bir alternatif olabilir. Zamanla, insanlar eksik olan şeylerin olduğunu keşfettiler ve bu yüzden Ant aynı kadar karmaşık hale gelene kadar özellikler eklediler, ancak yerleşik binutils (cp, rm, vb. Gibi harici araçlara dayanıyorlar) ve tabii ki XML sözdizimi var.
Laurence Gonsalves

2
Evet, ancak yeni bir alternatifin yaratıcısı yapabileceği en iyi şey, aslında bu sorunun ne olduğunu söylemeden "eskisinin sahip olduğu sorunları çözer" demek. Ant benim yaptığım sorunları çözüyor mu yoksa benim için yeni sorunlar getirirken sorun olduğunu düşünmediğim şeyleri çözüyor mu?
Laurence Gonsalves

9

Maven (ve Ivy özellikli Ant kurulumları) tarafından yapılan çözümlerde çözülen en önemli sorunlardan biri otomatik bağımlılık çözümlemesi ve bağımlılık kavanozlarınızın indirilmesidir.


6

Bence en olası açıklama, birkaç faktör Java topluluğu içinde kritik bir süre içinde (1990'ların sonlarında) kullanımı kullanımını caydırmak olduğunu düşünüyorum:

  1. Java birden fazla platformu kapsadığından, genel olarak Java programcıları, Unix araçlarında, genellikle bir Unix ortamıyla (örn., C ve Perl programcıları) sınırlandırılmış kadar usta değildi. Bunun GENEL OLARAK olduğunu unutmayın. Şüphesiz, Unix hakkında derin bir anlayışa sahip olan Java programcıları var ve yetenekli.
  2. Sonuç olarak marka yapımında daha az becerikliydi ve nasıl etkili bir şekilde kullanılacağını bilmiyorlardı.
  3. Java'yı verimli bir şekilde derleyen kısa ve basit bir Makefile yazmak mümkün olsa da, bunu platformdan bağımsız bir şekilde yapmak için ekstra dikkat gerekir.
  4. Sonuç olarak, kendinden platformdan bağımsız bir yapı aracı için bir iştah vardı.
  5. Bu ortamda Ant ve daha sonra Maven yaratıldı.

Kısacası, make kesinlikle Java projeleri için kullanılabilir olsa da, de facto Java derleme aracı yapmak için bir fırsat vardı. O an geçti.


5

Komut dosyalarının doğası gereği platforma bağımlı olma eğilimi gösterin. Java'nın platformdan bağımsız olması gerekiyor. Bu nedenle, çok platformlu bir kaynak tabanı için yalnızca tek bir platformda çalışan bir derleme sistemine sahip olmak bir tür problemdir.


5

Kısa cevap: Çünkü make iyi değil. C cephesinde bile birçok alternatif ortaya çıkıyor.

Uzun cevap: makeC derlemek için zar zor uygun hale getiren ve Java derlemek için hiç uygun olmayan birkaç kusura sahiptir. İsterseniz Java'yı derlemeye zorlayabilirsiniz, ancak bazıları uygun bir çözüm veya geçici çözümü olmayan sorunlarla karşılaşmayı bekleyebilirsiniz. Burda biraz var:

Bağımlılık çözünürlüğü

makedoğası gereği dosyaların birbirine ağaç benzeri bir bağımlılığa sahip olmasını bekler, burada bir dosya diğerlerini inşa etmenin çıktısıdır. Bu, başlık dosyalarıyla uğraşırken C'de zaten geri teper. bir C dosyasının başlık dosyalarına bağımlılığını temsil etmek makeiçin özel bir makeiçerme dosyası oluşturulmasını gerektirir ; Ancak, C dosyasının kendisi yeniden oluşturulmadığından (yalnızca yeniden oluşturulduğundan), genellikle hedefi hedef olarak belirtmeyi gerektirir .PHONY. Neyse ki, GCC bu dosyaların otomatik olarak oluşturulmasını destekler.

Java'da bağımlılık dairesel olabilir ve sınıf bağımlılıklarını otomatik olarak makebiçimlendirmek için bir araç yoktur . ant'nin Dependgörevi bunun yerine sınıf dosyasını doğrudan okuyabilir, hangi sınıfları içe aktardığını belirleyebilir ve bunlardan herhangi biri güncel değilse sınıf dosyasını silebilir. Bu olmadan, önemsiz olmayan bir bağımlılık, tekrarlanan temiz yapıları kullanmaya zorlanmanıza ve bir oluşturma aracı kullanmanın herhangi bir avantajını ortadan kaldırmanıza neden olabilir.

Dosya adlarındaki boşluklar

Ne Java ne de C kaynak kodu dosya adlarınızda boşluk kullanmayı teşvik etmese de make, boşluklar dosya yolunda olsa bile bu sorun olabilir. Örneğin, kaynak kodunuzun içinde olup olmadığını düşünün C:\My Documents\My Code\program\src. Bu kırmak için yeterli olurdu make. Bunun nedeni make, dosya adlarını dize olarak ele alır. antyolları özel nesneler olarak görür.

Derleme için dosyaları tarama

makeher hedef için hangi dosyaların oluşturulacağını açıkça ayarlamayı gerektirir. antkaynak dosyalar için otomatik olarak taranacak bir klasör belirtmeye izin verir. Küçük bir kolaylık gibi görünebilir, ancak Java'da her yeni sınıfın yeni bir dosya gerektirdiğini düşünün. Projeye dosya eklemek büyük bir güçlük haline gelebilir.

Ve en büyük sorun make:

make POSIX bağımlı

Java'nın sloganı "her yerde çalıştırıldığında derleme" dir. Ancak bu derlemeyi, Java desteğinin aslında en kötü olduğu POSIX tabanlı sistemlerle sınırlamak niyet değildir.

Oluşturma kuralları makeaslında küçük bashkomut dosyalarıdır. makeWindows'un bir bağlantı noktası olmasına rağmen , düzgün çalışması bashiçin, dosya sistemi için bir POSIX öykünme katmanı içeren bir bağlantı noktasıyla paketlenmesi gerekir .

Bu iki çeşittir:

  1. MSYS POSIX çevirisini dosya yollarıyla sınırlandırmaya çalışır ve bu nedenle özellikle bunun için yapılmayan harici araçları çalıştırırken hoş olmayan gotcha'lara sahip olabilir.

  2. cygwintam bir POSIX emülasyonu sağlar. Bununla birlikte, sonuçta ortaya çıkan programlar hala bu emülasyon tabakasına güvenme eğilimindedir.

Bu nedenle, Windows'ta standart oluşturma aracı hiç de makedeğil MSBuild, prensip olarak daha yakın olan XML tabanlı bir araçtır ant.

Buna karşılık, antJava'da yerleşiktir, her yerde çalışabilir ve dosyaları işlemek ve komutları platformdan bağımsız bir şekilde yürütmek için "görevler" adı verilen dahili araçlar içerir. Gerçekte daha kolay bir saati kullanarak Windows'ta C programı bina olabileceğini yeterince çok yönlü olduğunu antkullanmaktan daha make.

Ve son bir küçük:

C programları bile yerel olarak

Başlangıçta bunu fark etmeyebilirsiniz, ancak C programları genellikle a ile birlikte gönderilmez Makefile. Bunlar , gerçek olanı oluşturan CMakeLists.txtbir bashyapılandırma komut dosyasıyla gönderilir Makefile. Bunun aksine, kullanılarak oluşturulan bir Java programının kaynağı önceden antoluşturulmuş bir antkomut dosyasıyla gönderilir . A Makefile, diğer araçların bir ürünüdür - Tek makebaşına bir yapı aracı olmak için ne kadar uygun değildir. antbağımsızdır ve herhangi bir ek gereksinim veya bağımlılık olmadan Java oluşturma işleminiz için ihtiyacınız olan her şeyle ilgilenir.

antHerhangi bir platformda çalıştırdığınızda Just Works (tm). Bunu alamazsın make. Platform ve yapılandırmaya inanılmaz derecede bağımlı.


4

Ben kimse değilsem, java için make'i kullanan (yanlış) kimsenin yanlış olduğu varsayımı yanlıştır.

"GNU Make ile Projeleri Yönetme" (GFDL altında bulunur), makejava projelerinde kullanılmak üzere ayrılmış eksiksiz bir bölüm içerir .

Diğer araçların yerine marka kullanımının artılarını ve eksilerini içeren uzun (ve umarım adil) bir liste içerdiğinden, oraya bir göz atmak isteyebilirsiniz. (bkz: http://oreilly.com/catalog/make3/book/ )


Bu doğru bir özet mi? make (çeşitli tatlarda) Java için kullanılabilir, ancak biraz acı ile. Ant ve Maven (ve jmake ?), Java projelerinin daha hızlı ve daha kolay oluşturulmasını sağlamak için Java'nın ihtiyaç duyduğu / sevdiği bazı özel şeyler yapar. Ayrıca, Java dışı projeler için platformdan daha bağımsız bir oluşturma işlemi için kullanılabilir, ancak Java için daha fazla ayarlanır.
Phil Perry

3

Ant, Makefiles üzerinde XML konfigürasyonuna yönelik bir iyileştirmedir ve Maven, Ant üzerinde bir bağımlılık oluşturma aracı geliştirmesidir. Bazı projeler üçünü de kullanır. Bence JDK projeleri eskiden makefiles ve ant karışımını kullanıyordu.


1

Bunun büyük bir nedeni hem Ant hem de Maven'in (ve çoğu java hedefli SCM, CI ve IDE araçlarının) java tarafından java geliştiricileri tarafından / for için yazılmış olmasıdır. Bu, geliştirme ortamınıza entegre etmenizi kolaylaştırır ve IDE ve CI sunucuları gibi diğer araçların ant / maven kitaplıklarının bölümlerini oluşturma / dağıtım altyapısı içine entegre etmesine olanak tanır.


1

Bir zamanlar gmake kullanan bir Java projesi üzerinde çalıştım. Hatırlama puslu ama IIRC, Javac'ın beklediği paket dizin yapısı ile uğraşmakta zorlandık. Önemsiz bir şey olmadıkça JAR dosyaları oluşturmanın bir güçlük olduğunu da hatırlıyorum.


1

ApacheAnt, Make gibi bir şey değildir. Make, dosyalar arasındaki bağımlılıkları ve dosyaların nasıl oluşturulacağını anlatmakla ilgilidir. Ant, "görevler" arasındaki bağımlılıklarla ilgilidir ve yapı komut dosyalarını birbirine yapıştırmanın bir yoludur.

Eğer size yardımcı olabilir AntVsMake


Downvotların nedenlerini gerçekten bilmek istiyorum.
hagello

0

Ant ve Maven, yapı bağımlılığı grafiğine ve onun yönetimine daha 'modern' bir bakış açısıyla yaklaşıyorlar ... Ancak Oscar'ın dediği gibi, eski problemleri make ile çözmeye çalışırken kendi problemlerini yarattılar.


0

GNU Make for Java projelerini hiç kullanmadım ama jmk kullanıyordum . Ne yazık ki 2002'den beri güncellenmedi.

Java'ya özgü bazı işlevleri vardı, ancak boyutunu önemli ölçüde artırmadan kaynak tarball'ınıza dahil edilecek kadar küçüktü.

Günümüzde sadece kod paylaştığım Java geliştiricilerinin Ant yüklü olduğunu varsayalım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.