Cách tạo .jar ra từ dự án Android Studio


96

Tôi đang sử dụng AndroidStudio và tôi có dự án này như được hiển thị:

nhập mô tả hình ảnh ở đây

Bên trong vòng tròn màu xanh là myLib. myLib cũng cần sử dụng lib bên ngoài nằm bên trong vòng tròn màu đỏ và một gói apache (vòng tròn màu xanh lá cây).

Vì vậy, tôi muốn làm cho toàn bộ thứ này trở thành một .jar duy nhất, để tôi có thể sử dụng nó trong các dự án khác.

Hướng dẫn từng bước sẽ thực sự được đánh giá cao, tôi là người mới bắt đầu trong thế giới nhà phát triển.

Cảm ơn!


1
Tôi nghĩ những gì bạn muốn là một tệp aar (kho lưu trữ Android) mà một tệp có thể được liên kết yên tĩnh đơn giản như phụ thuộc. Về cơ bản, bạn cần tạo một dự án thư viện Android. Nhưng tôi không thể viết các bước chính xác từ tâm trí.
rekire

2
Tôi cần tệp .jar để có thể sử dụng trong bất kỳ dự án java nào. Không chỉ của Android.
dum4ll3

1
Phải gần giống nhau - tạo một dự án thư viện và xuất nó.
Thrash Bean

Lỗi này mô tả sự thiếu hụt trong các plugin gradle Android có thể ngăn chặn một cách dễ dàng hack buildfile gradle để thêm mục tiêu jar ...
mmigdol

Câu trả lời:


135
  • Mở build.gradle cho dự án thư viện nhập mô tả hình ảnh ở đây

  • Viết hai tác vụ trong build.gradle - deleteJar và createJar và thêm quy tắc createJar.dependsOn (deleteJar, xây dựng) nhập mô tả hình ảnh ở đây

Mã từ trên:

task deleteJar(type: Delete) {
    delete 'libs/jars/logmanagementlib.jar'
}           

task createJar(type: Copy) {
    from('build/intermediates/bundles/release/')
    into('libs/jars/')
    include('classes.jar')
    rename('classes.jar', 'logmanagementlib.jar')
}

createJar.dependsOn(deleteJar, build)
  • Mở rộng bảng điều khiển gradle từ bên phải và mở tất cả các tác vụ trong thư viện của bạn-> các tác vụ khác. Bạn sẽ thấy hai tác vụ mới ở đó - createJar và deleteJar nhập mô tả hình ảnh ở đây

  • Nhấp đúp vào createJar nhập mô tả hình ảnh ở đây

  • Khi tác vụ chạy thành công, hãy lấy jar đã tạo của bạn từ đường dẫn được đề cập trong tác vụ createJar, tức là libs / xxxx.jar nhập mô tả hình ảnh ở đây

  • sao chép jar mới được tạo vào thư mục lib của dự án yêu cầu của bạn -> nhấp chuột phải -> chọn "thêm làm thư viện"


4
Đôi khi người ta hiểu bằng cách xem hơn là đọc. Đó là một UX tốt mà bạn nhìn thấy ☺
Abhinav Tyagi

5
Vậy thì tôi nên nói với bạn rằng tôi không chắc lắm release. Tôi có debugdefault, nhưng không có releasethư mục. Bạn đang sử dụng phiên bản plugin nào? Bạn có biết nếu điều này được tài liệu ở bất cứ đâu?
Cameron Lowell Palmer

3
Tôi không có releasethư mục.
Kamran Bigdely

4
Bạn đang cố gắng sao chép cái gì vậy ?? Chúng ta có nên nhắm mục tiêu các thư mục chứa tệp APK không ?? Ý tôi là trong dòng từ ('build / Intermediateates / bundles / default'), thư mục này chứa những gì cho bạn. Không có thư mục nào trong studio Android của tôi với các gói tên và tôi tiếp tục nhận được KHÔNG NGUỒN trong tác vụ
createJar

12
thay đổi từ ( 'build / trung gian / bó / release /') để từ ( 'build / trung gian / đóng gói-lớp / release /') cho Android Studio 3.1.3 và phiên bản Gradle 4.4
Vaishakh

59

Nếu bạn thiết lập mã dưới dạng một mô-đun Java thuần túy trong Gradle, thì thật dễ dàng để Gradle cung cấp cho bạn một tệp jar có nội dung. Tệp jar đó sẽ chỉ có mã của bạn, không có các thư viện Apache khác mà nó phụ thuộc vào. Tôi khuyên bạn nên phân phối nó theo cách này; hơi kỳ lạ khi nhóm các phụ thuộc bên trong thư viện của bạn và bình thường hơn là người dùng của các thư viện đó phải tự bao gồm các phụ thuộc đó (bởi vì nếu không có sự va chạm của các dự án đó đã liên kết các bản sao của thư viện, có thể là các phiên bản khác nhau ). Hơn nữa, bạn tránh được các vấn đề cấp phép tiềm ẩn xung quanh việc phân phối lại mã của người khác nếu bạn muốn xuất bản thư viện của mình.

Lấy mã cũng cần được biên dịch vào một jar và chuyển nó sang một mô-đun Java thuần túy riêng biệt trong Android Studio:

  1. Menu tệp > Mô-đun mới ... > Thư viện Java
  2. Thiết lập thư viện, tên gói Java và tên lớp trong trình hướng dẫn. (Nếu bạn không muốn nó tạo một lớp cho bạn, bạn chỉ có thể xóa nó sau khi mô-đun được tạo)
  3. Trong mã Android của bạn, hãy thiết lập phần phụ thuộc vào mô-đun mới để nó có thể sử dụng mã trong thư viện mới của bạn:
  4. Tệp > Cấu trúc dự án > Mô-đun > (Mô-đun Android của bạn) > Phụ thuộc > + > Phụ thuộc mô-đun . Xem ảnh chụp màn hình bên dưới: nhập mô tả hình ảnh ở đây
  5. Chọn mô-đun của bạn từ danh sách trong hộp thoại xuất hiện: nhập mô tả hình ảnh ở đây

Hy vọng rằng dự án của bạn sẽ được xây dựng bình thường ngay bây giờ. Sau khi bạn xây dựng, một tệp jar cho thư viện Java của bạn sẽ được đặt trong thư mục build / libs trong thư mục của mô-đun của bạn. Nếu bạn muốn tạo tệp jar bằng tay, bạn có thể chạy tác vụ tệp xây dựng jar của nó từ cửa sổ Gradle: nhập mô tả hình ảnh ở đây


Cảm ơn rât nhiều! Câu trả lời của bạn thực sự hữu ích, hầu hết trong ảnh chụp màn hình cuối cùng hiển thị các nhiệm vụ Gradle. Tôi không biết điều đó. Tôi có thể làm theo các bước của bạn, nhưng tôi vẫn thiếu org.apache.http.Header. Làm cách nào để nhập nó vào lib của tôi?
dum4ll3

Ý bạn là gì khi bạn nói rằng bạn đang thiếu nó?
Scott Barta

1
Đi qua cùng một cấu trúc dự án> luồng phụ thuộc, nhưng chọn mô-đun thư viện thay vì dự án của bạn và thêm phần phụ thuộc theo cách tương tự. Trong câu trả lời của tôi, tôi nói rằng nó đặt tệp jar trong build / libs dir trong thư mục mô-đun của nó.
Scott Barta

1
Tôi đã nhận: java.lang.NoClassDefFoundError: com.loopj.android.http.RequestParams. Đó là thư viện bên ngoài của tôi mà tôi đang biên dịch với của tôi.
dum4ll3

2
Nó chỉ làm việc với thư viện java, và nhiệm vụ jar trong thư viện Android không tồn tại
cuasodayleo

26

Trong IDE Android Studio, truy cập " thanh Run Anything " bằng cách:

CTRL+ CTRL+ gradle CreateFullJarRelease+ENTER

Sau đó, bạn sẽ tìm thấy đồ tạo tác của mình trong thư mục này trong dự án của bạn
Build > Intermediates > Full_jar > Release > CreateFullJarRelease > full.jar


HOẶC LÀ


Gradle đã có sẵn Taskcho điều đó, trong menu bên gradle, bên dưới otherthư mục.

thanh công cụ gradle

Sau đó cuộn xuống createFullJarReleasevà nhấp vào nó.

Gradle Tasks

Sau đó, bạn sẽ tìm thấy đồ tạo tác của mình trong thư mục này trong dự án của bạn

Build > Intermediates > Full_jar > Release > CreateFullJarRelease > full.jar


2
Không thể thấy tùy chọn này. Điều này đã được thêm vào phiên bản Studio gần đây chưa?
Dibzmania

1
Tôi xây dựng và khi tìm thấy * .jar, tên của nó là: full.jar. 30 phút để tìm thấy nó lol
nobjta_9x_tq Ngày

1
Trong trường hợp của tôi, tôi tìm thấy nó trongbuild\intermediates\intermediate-jars\release
Yusril Maulidan Raji

Tôi có một câu hỏi. Trong trường hợp của tôi, nó tạo ra 3 tệp jar. classes.jar, full.jarres.jar. Tôi có nên nhập tất cả các tệp jar bất cứ khi nào tôi muốn sử dụng nó không?
Yusril Maulidan Raji

Chỉ cần sử dụng full.jar
Haroun Hajem

11

Chỉ cần thêm cái này vào build.gradle của mô-đun java của bạn. Nó sẽ bao gồm các thư viện phụ thuộc trong kho lưu trữ.

mainClassName = "com.company.application.Main"

jar {
  manifest { 
    attributes "Main-Class": "$mainClassName"
  }  

  from {
    configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
  }
}

Điều này sẽ dẫn đến tệp .jar [module_name] / build / libs / [module_name].


Nhưng liệu một thư viện .jar có một lớp Chính không? OP cho biết họ đang xây dựng một tệp .jar "để tôi có thể sử dụng trong các dự án khác" (sic). Nghe giống như một thư viện.
Steve White

Chỉ có anh chàng này thực sự hiểu rằng, chỉ tạo ra cái lọ không giải quyết được vấn đề. điều gì xảy ra nếu chúng ta cần thực hiện nó. Đoạn mã trên tránh được lỗi "Không thể thực thi tệp jar:" không có thuộc tính tệp kê khai chính "".
MobileEvangelist

1

Tệp .jar sẽ tự động được tạo khi bạn biên dịch / chạy ứng dụng của bạn.

Bạn có thể tìm thấy tệp class.jar của mình từ root_folder / app / build / Intermediateates / Bundles / debug

vị trí tệp jar


1
  1. Chuyển đến tab Gradle trong Android Studio, sau đó chọn dự án thư viện.

  2. Sau đó chuyển đến Nhiệm vụ

  3. Sau đó đi đến Khác

  4. Nhấp đúp vào bóReleaseaar

Bạn có thể tìm thấy các .aartệp của mình trongyour_module/build/outputs/aar/your-release.aar

Hình ảnh đây


Tôi không thấy "Gradle Tab" nào ở đâu cả. Cuối cùng, tôi đã nhập "Gradle" trong tìm kiếm Trợ giúp và nhận được một cái gì đó giống như chế độ xem Gradle của bạn. Nhưng danh sách bên trong rất khác, ngắn hơn nhiều so với danh sách của bạn. Không có góiReleaseaar trong Nhiệm vụ-> Khác. Có một "createJar", nhưng khi tôi nhấp vào đó, tôi nhận được "Tác vụ 'createJar' không tìm thấy trong dự án gốc ..." Tôi bị mắc kẹt. Và ... tại sao chúng ta muốn tệp .aar? OP đã yêu cầu một tệp .jar. Đó có phải là điều tương tự không>
Steve White

Nhưng câu hỏi là làm thế nào để .jarkhông.aar
Aleksey Timoshchenko

0

cách tôi tìm thấy là tìm đầu ra của trình biên dịch dự án (cấu trúc dự án> dự án). sau đó tìm thư mục tuân thủ của mô-đun mà bạn muốn chuyển sang jar, nén nó bằng zip và thay đổi phần mở rộng của đầu ra từ zip thành jar.


0
task deleteJar(type: Delete) {
    delete 'libs/mylibrary.jar'
}           

task exportjar(type: Copy) {
    from('build/intermediates/compile_library_classes/release/')
    into('libs/')
    include('classes.jar')
    rename('classes.jar', 'mylibrary.jar')
}

exportjar.dependsOn(deleteJar, build)

0

Nếu bạn chạy tác vụ gradle từ AndroidStudio [Thêm]

assembleRelease 
//or
bundleReleaseAar

hoặc qua thiết bị đầu cuối

./gradlew <moduleName>:assembleRelease
//or
./gradlew <moduleName>:bundleReleaseAar

sau đó bạn sẽ có thể tìm thấy .aartrong

<project_path>/build/outputs/aar/<module_name>.aar
//if you do not see it try to remove this folder and repeat the command

.aarTệp (Thư viện Android) bao gồm tệp .jar(Thư viện Java) và các tài nguyên Android bổ sung. .aartệp là tệp zip có phần mở rộng aar đó là lý do tại sao bạn có thể thay thế .aarbằng .ziphoặc chạy

unzip "<path_to/module_name>.aar"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.