AAR'yi JAR'a dönüştürme


95

Durum :

Bir Java kitaplığı kullanmayı planlıyorum ve yalnızca bir Maven deposundan bir AAR dosyam var, ancak JAR dosyasına ihtiyacım var .

Arka plan hikayesi:

Bir kitaplık derlemeye çalıştım ama Gradle yapısı kararsızdı. Bu yüzden derlenmiş bir jar dosyası istedim ve geliştiricisi bana bazı Maven deposundan bir aar dosyası verdi (geliştirici kendi projesini derleyemedi). Gradle yapılandırması karmakarışıktı, birden fazla kütüphaneye bağlıydı ve Gradle bazı istisnalar attı.

Onu IDEA IDE'mde kullanmayı denedim, ancak göremedi. Bir kütüphane projesi bir jar dosyasına derlenebilmelidir, değil mi?

Soru :

Bu AAR dosyasını bir JAR dosyasına dönüştürmek için ne yapmalıyım?


1
Bunu yeniden .jar olarak yeniden adlandırabilirsiniz, ancak ortamınız hakkında daha fazla ayrıntı bilmeden yapmanız gereken bu olabilir veya olmayabilir, bir AAR, belirli kullanımları olan bir Eksen kitaplığıdır.
Bilgiçlikçi

1
Gülüyor olacaksınız, ama normal olmayan bir kelime eklemek zorunda kaldım çünkü SO sorumun bu kadar basit kelimeli olduğu için yayınlanmasına izin vermezdi. Ve sanırım, kütüphane geliştiricisinin Gradle kullanarak kendi projesini derleyemeyeceği her şeyi anlatıyor ...
Nestor

Yanıtlar:


144

AAR dosyası oluşur JAR dosyası ve bazı kaynak dosyaları (temelde özel bir dosya uzantısına sahip standart bir zip dosyası). İşte dönüştürmek için adımlar:

  1. AAR dosyasını standart zip ekstresi kullanarak çıkarın ( daha kolay hale getirmek için * .zip olarak yeniden adlandırın )
  2. Çıkarılan dosyalarda classes.jar dosyasını bulun
  3. İstediğiniz gibi yeniden adlandırın ve bu jar dosyasını projenizde kullanın

55
Bu cevabın kabul edilmesi ilginçtir, çünkü bir jar dosyasını yeniden adlandırmak ve projenizin kütüphaneler dizinine kopyalamak, jar kaynak dosyalarının eksik olması nedeniyle çalışmayacaktır.
ChuongPham

Spotify Android SDK öğreticisinin ardından, bu cevap çare oldu. Bunun nedeni, Netbeans'te AAR uzantısına uygun olmayan projeler geliştirmemden kaynaklanıyor. ChuongPham'ın açıklaması bu cevapla değil, AWT'nin cevabıyla ilgili gibi görünüyor ve sonra kısmen ChuongPham'a katılıyorum, yani AAR'dan JAR'a basit yeniden adlandırma işe yaramıyor. Bununla birlikte, kısmen katılmıyorum çünkü "kaynaklar", classes.jar dosyasıyla ilgili değildir.
carl

11
Başkalarının da olması durumunda onu mac'da nasıl çıkaracağımı bulmakta zorlandım: .aar'ı .zip olarak değiştirin ve çift tıklayın!
Bastien Beurier

5
Öyleyse kaynak tabanlı bir jar oluşturmanın çözümü nedir?
2cupsOfTech

2
Bu çözüm yalnızca jar dosyasını çıkarır, ancak içinde bulunmayan kaynaklar. Bir şeyler yanlış olabilir.
Tinker Sun

21

.aar, .jar'da kullanılanın aynısı olan standart bir zip arşividir. Sadece uzantıyı değiştirin ve bozuk olmadığını veya herhangi bir şey olmadığını varsayarak, iyi olması gerekir.

Gerekirse, onu dosya sisteminize çıkarabilir ve ardından bir jar olarak yeniden paketleyebilirsiniz.

1) Rename it to .jar
2) Extract: jar xf filename.jar
3) Repackage: jar cf output.jar input-file(s)

Jar xf'yi çalıştırdığımda hiçbir şey almıyorum: C: \ Program Files \ Java \ jdk1.7.0_25 \ bin> jar xf c: \ dev \ 1 \ android-maps-utils- 0.2.1.jar C: \ Program Dosyalar \ Java \ jdk1.7.0_25 \ bin>
Nestor

1
dostum, 1. adım yeterli. Sadece .jar olarak yeniden adlandırın. Benim görüşüme göre (2) ve (3) adımları işe yaramaz
Dr Deo

@DrDeo Eğer adını değiştirirsem, eclipse projesi onu bir kütüphane olarak tanımıyor. Bu normal mi? Herhangi bir ipucu?
Tanasis

1
Sadece yeniden adlandırırsanız ve jar ile yeniden paketlemezseniz, bir manifesto olmayacak ve onu geçerli bir jar dosyası olarak tanımayacağına inanıyorum.
AWT

16

Diğer birçok kişinin de belirttiği gibi, .jar dosyasını .aar dosyasından çıkarmak, kaynaklar eksik olabileceğinden tam olarak yeterli olmaz.

İşte benim için işe yarayan adımlar (Android bağlamında, başka amaçlarınız varsa kilometreniz değişebilir):

  1. .Aar dosyasını .zip olarak yeniden adlandırın ve ayıklayın.
  2. Çıkarılan klasör, Eclipse'de bazı küçük değişikliklerle içe aktarabileceğiniz bir ADT projesidir (aşağıya bakın)!
  3. Ayıklanan klasöründe bulunan dosya yeniden adlandırma classes.jar (bu örnek myProjectLib.jar olarak) gibi ne olursa olsun size ve çıkartılan klasörün içindeki lib klasörüne taşıyın.
  4. Şimdi Eclipse'in bunu kabul etmesi için, çıkarılan klasör köküne iki dosya koymanız gerekir:
    • .project
    • .classpath
  5. Bunu yapmak için Eclipse'de yeni bir Android kukla projesi oluşturun ve dosyaların üzerine kopyalayın veya mevcut bir Android projesinden kopyalayın.
  6. .Project dosyasını açın ve XML ad etiketini arayın ve bunun içeriğini myProjectLib (veya yukarıda jar dosyanızı adlandırdıysanız) ile değiştirin ve kaydedin.
  7. Şimdi Eclipse'de mevcut kaynaktan Dosya -> Yeni -> Proje -> Android Projesi yapabilirsiniz .. ve çıkarılan klasör içeriğine işaret edebilirsiniz.
  8. İçe aktardıktan sonra yeni oluşturulan projeye sağ tıklayın, Özellikler -> Android'i seçin ve Kitaplık'ı işaretleyin .
  9. Kitaplığı kullanmak istediğiniz ana projenizde, Özellikler -> Android'e gidin ve yeni eklenen myProjectLib'i bağımlılıklar listesine ekleyin.

Bu bana yardımcı oldu. Ancak tam olarak çalışıp çalışmadığına ulaşmak için, 6. ve 7. adımlar arasında boş bir "src" klasörü oluşturmam gerekiyordu.
Bernhard Krenz

8

Bunu otomatik olarak yapmak isteyenler için, sonraki iki şeyi yapan iki satırlık küçük bir bash betiği yazdım:

  1. Tüm * .aar dosyalarını arar ve onlardan classes.jar dosyasını çıkarır
  2. Çıkarılan classes.jar dosyasını aar gibi ancak yeni bir uzantıyla yeniden adlandırır

    find . -name '*.aar' -exec sh -c 'unzip -d `dirname {}` {} classes.jar' \;
    find . -name '*.aar' -exec sh -c 'mv `dirname {}`/classes.jar `echo {} | sed s/aar/jar/g`' \;
    

Bu kadar!


1
Elbette, herhangi bir aar2jar dönüşümü kaynakları içermeyecek ve içinde tezahür etmeyecektir. Bunu (kesinlikle değil ama yakın) söyleyebiliriz aar=jar+res+manifest+libs. Bırak rest=res+manifest+libs, sonra jar(aar)=aar-rest.
ddmytrenko

Gerçekten istediğim şey bu! Çok teşekkürler. Ama gerçekten disk kullanımını artırıyor. çünkü her destek kitaplığının birçok sürümü vardır. sadece en son
sürümü

6

Android Studio (sürüm: 1.3.2), bir .aar içinde .jar'a sorunsuz bir şekilde erişmenizi sağlar.

Bonus: Sınıfları otomatik olarak yeniden derler!

Aşağıdaki adımları uygulamanız yeterlidir:

  1. File > New > New Module > Import .JAR/.AAR Package sizi .aar'ı bir modül olarak içe aktarmak için

  2. Yeni oluşturulan modülü ana projenize bağımlılık olarak ekleyin (gerekli olup olmadığından emin değilsiniz)

  3. Aşağıdaki görüntüde gösterildiği gibi "classes.jar" üzerine sağ tıklayın ve "Gezginde göster" i tıklayın. İşte .jar'ınız.

.aar'dan .jar'a erişim


1
önce proje yöneticisinde android yerine proje seçmelisiniz, ardından harici kütüphaneler gösterilecek
Samad

5
 The 'aar' bundle is the binary distribution of an Android Library Project. .aar file 
 consists a JAR file and some resource files. You can convert it
 as .jar file using this steps

1) Copy the .aar file in a separate folder and Rename the .aar file to .zip file using 
 any winrar or zip Extractor software.

2) Now you will get a .zip file. Right click on the .zip file and select "Extract files". 
 Will get a folder which contains "classes.jar, resource, manifest, R.java,
 proguard(optional), libs(optional), assets(optional)".

3) Rename the classes.jar file as yourjarfilename.jar and use this in your project.

Not: .aar dosyanızdan yalnızca .jar dosyasını almak istiyorsanız, yukarıdaki yolu kullanın. Farz edin ki, manifest.xml ve kaynakları .jar dosyanızla birlikte eklemek istiyorsanız, .aar dosyanızı sağ tıklayıp .zip olarak kaydetmek yerine doğrudan .jar dosyası olarak kaydedebileceğiniz anlamına gelir. Çıkardığınız .jar dosyasını görüntülemek için, JD-GUI'yi (Java Decompiler) indirin . Sonra .jar dosyanızı bu JD_GUI'ye sürükleyip bırakın, .class dosyasını .java dosyası gibi okunabilir biçimlerde görebilirsiniz.

görüntü açıklamasını buraya girin görüntü açıklamasını buraya girin


Bu, AAR dosyasını sadece .aar'dan .jar'a yeniden adlandırarak bir JAR dosyası gibi kullanabileceğimiz anlamına mı geliyor?
Soumya

@Soumya, hayır, yapamazsın.
ddmytrenko

2
Aslında konuşmanın konusu yanlış. AAR'yi JAR'a veya tam tersini dönüştüremeyiz. Yapabileceğimiz tek şey "JAR'ı AAR'dan çıkarmak". Ve burada iki satır Bash kodunu kullanarak bu otomatik olarak nasıl yapılacağını yazdım: stackoverflow.com/a/29252592/746529
ddmytrenko

5

Kaynak tabanlı .aar projeleri

.Aar dosyası içinde classes.jar dosyasını bulmak oldukça önemsizdir. Ancak, .aar projesi bazı kaynakları tanımladıysa bu yaklaşım işe yaramaz (örnek: R.layout.xyz)


1

Derlemeleriniz için Gradle kullanıyorsanız - java | kotlin | scala | ... modüllerinize aar bağımlılığı eklemenizi sağlayan bir Gradle eklentisi vardır.

https://github.com/stepango/aar2jar

plugins {
    id 'java'
    id 'com.stepango.aar2jar' version “0.6// <- this one
}

dependencies {
    compileOnlyAar "com.android.support:support-annotations:28.0.0" // <- Use any AAR dependencies
}

Anlamaya çalışıyorum, android app / lib eklentisi için 'compileOnlyAar' yapmak mümkün mü? Bunun kitaplığınızla ilgili olmadığını biliyorum, ancak belki de biliyorsunuzdur, çünkü android eklentisi 'compileOnlyAar' gibi yapay yapılandırma içermiyor. Bu işleve neden ihtiyacım olduğunu buradan anlayabilirsiniz ( stackoverflow.com/questions/60998072/… )
HeyAlex

alıntılarınız bozuk ve düzenleme kuyruğu dolu olduğu için düzenleme
yapamıyorum
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.