2012-03-29 40 views
5

Tôi đang cố đưa cocos2d vào một ứng dụng từ trước. Tôi đã làm mọi thứ theo cách của Eclipse, chẳng hạn như thiết lập "isLibrary" và thêm các dự án thư viện để build path trong Eclipse, và tôi có sự phụ thuộc sau đây trong ứng dụng của tôi pom.xml:Thêm dự án và thư viện "Android Library" của Eclipse qua Maven

<dependency> 
    <groupId>cocos2d_android</groupId> 
    <artifactId>cocos2d_android</artifactId> 
    <version>1.0.0-SNAPSHOT</version> 
    <scope>provided</scope> 
</dependency> 

tôi nghĩ sẽ này' đã quan tâm đến vấn đề này, nhưng khi tôi xây dựng, thư viện dường như không được đưa vào. Tôi biết điều này vì khi tôi bắt đầu một hoạt động, SimpleGame, tham khảo một trong các lớp trong nguồn cocos2d, Hoạt động chết và tôi nhận được stacktrace này trong DDMS:

E/AndroidRuntime(10621): FATAL EXCEPTION: main E/AndroidRuntime(10621): java.lang.NoClassDefFoundError: org.cocos2d.opengl.CCGLSurfaceView E/AndroidRuntime(10621): at com.xyz.game.SimpleGame.onCreate(SimpleGame.java:22) ...

Tôi đang tìm kiếm hai điều:

1) một cách đáng tin cậy để xem nếu một lớp nhất định/jar/bất cứ điều gì đã được đóng gói thành các gói ứng dụng của tôi, như các bước để có được đến thời điểm này trong ứng dụng của tôi dài và phức tạp ngay bây giờ

2) một cái gì đó trong Tệp kê khai hoặc tệp pom.xml cho ứng dụng chính hoặc dự án thư viện có vẻ bị thiếu - s một cái gì đó cần thiết để báo hiệu cho Maven để nhận dự án khác này - nó là gì?

Tôi đang sử dụng Maven 3.0.4 và 3.0.0-alpha-13 của plugin, xây dựng cho cấp 8 trở lên.

Trả lời

4

1) một cách đáng tin cậy để xem nếu một lớp nhất định/jar/bất cứ điều gì đã được đóng gói thành các gói ứng dụng của tôi, như các bước để có được đến thời điểm này trong ứng dụng của tôi dài và phức tạp ngay bây giờ

dự án xây dựng từ dòng lệnh (cài đặt ví dụ mvn sạch), maven sẽ đưa ra các bản ghi tiết trong mỗi giai đoạn/mục tiêu duy nhất của xây dựng, trong mục tiêu dex, bạn có thể nhìn thấy một cái gì đó như thế này:

[INFO] --- android-maven-plugin: 3.1.1: dex (mặc định-dex) @ myproject ---
[INFO] C: \ Program Files \ Java \ jdk1.6.0_21 \ jre \ bin \ java [-Xmx1024M, -jar, C: \ Progr am Tệp \ Android \ android-sdk-r16 \ nền tảng công cụ \ lib \ dx.jar, --dex, --output = C: \ workspace \ myproject \ target \ classes.dex, C: \ workspace \ myproject \ target \ classes, C: \ maven \ repository \ cocos2d_android \ cocos2d_android \ 1.0.0-SNAPSHOT \ cocos2d_android-1.0.0-SNAPSHOT.apklib, C: \ maven \ repository \ com \ google \ code \ gson \ gson \ 1.7.1 \ gson-1.7.1.jar, ... ...]

Dự án Thư viện Android thực sự là dex-ed là cocos2d_android-1.0.0 -SNAPSHOT.apklib với một số lưu trữ thư viện jar thông thường khác.


2) Một cái gì đó trong Manifest hoặc pom.xml cho một trong hai ứng dụng chính hay dự án thư viện có vẻ là thiếu - một cái gì đó cần thiết để ra hiệu cho Maven để nhận dự án khác này - những gì là nó?

Đó là ApkLib, mà chỉ đơn giản là một kho lưu trữ zip Dự án Thư viện Android (src /, res /, AndroidManifest.xml và vv). Chúng tôi thường tạo/triển khai Dự án Thư viện Android của riêng mình với Dự án Android phụ thuộc làm dự án maven đa mô-đun, tuy nhiên, điều này không cần thiết trong trường hợp bạn cần tham khảo Dự án Thư viện Android do các nhà phát triển khác viết. Nhờ nhà phát triển, plugin android-maven đã hỗ trợ Dự án Thư viện Android không phải là Maven, hãy xem Compatible with non-Maven Android Library Projects:

Tệp .apklib được tạo sẽ có bố cục dự án thư viện Android/Eclipse chuẩn. Điều này có nghĩa là bất kể bố cục Maven của bạn, bố cục bên trong tệp .apklib sẽ là mã nguồn nằm trong "src /" thay vì "src/main/java /", nhưng vẫn được hiểu chính xác khi được sử dụng trong ứng dụng Android/Maven dự án. Điều này là tương thích với các dự án thư viện của các nhà phát triển không phải Maven, điều quan trọng là phát triển cộng đồng nhà phát triển Android.

Sử dụng khác phát triển phi Maven thư viện

Nó cũng có nghĩa là chúng ta có thể lấy bất kỳ file zip Android dự án thư viện bên ngoài (từ các nhà phát triển không Maven) và làm mvn cài đặt: cài đặt file ... trên nó và đơn giản là bắt đầu sử dụng nó như một sự phụ thuộc.

Share .apklib của bạn với các nhà phát triển không Maven

Để chia sẻ tập tin .apklib của bạn với một nhà phát triển phi Maven, có lẽ họ sẽ cảm thấy thoải mái hơn nếu bạn đổi tên nó thành .zip. Sau đó, họ có thể chỉ cần giải nén nó trong một thư mục và sử dụng nó từ đó.

Vì vậy, cách giải quyết là:

  1. Gói Dự án Thư viện Android của bạn thành kho lưu trữ zip đúng cách, sau đó đổi tên nó để something.apklib.
  2. Cài đặt something.apklib vào kho lưu trữ cục bộ Maven của bạn bằng cách sử dụng mvn install: install-file.
  3. Trong bất kỳ dự án Android đòi hỏi Thư viện phụ thuộc, chỉ cần sử dụng:

    <dependency> 
        <groupId>cocos2d_android</groupId> 
        <artifactId>cocos2d_android</artifactId> 
        <version>1.0.0-SNAPSHOT</version> 
        <type>apklib</type> 
    </dependency> 
    

Check-out Samples trên trang web android-maven-plugin để xem làm thế nào để sử dụng apklib đúng cách.

+0

Cảm ơn yorkw!Mặc dù có cách nào để Maven kéo vào và nén dự án? Bản sao của tôi cocos2d là một bản sao chỉ đọc từ github và tôi rất thích sự tiện lợi của việc không lặp lại quá trình này mỗi khi một sự thay đổi đi ra khỏi github ... –

+0

Tôi không biết nếu có bất kỳ plugin maven có thể làm kéo, zip và cài đặt tự động từ github. Bạn sẽ nâng cấp ứng dụng của mình bao lâu một lần? Từ góc độ sản xuất, không cần thiết phải duy trì/nâng cấp các phụ thuộc của ứng dụng yêu cầu tại cơ sở hàng ngày hoặc hàng tuần. Cách giải quyết thủ công là cách duy nhất cho android-maven-plugin được cung cấp và tôi nghĩ rằng nó được chấp nhận để bảo trì hiệu quả trong hầu hết các điều kiện. – yorkw

+0

lưu ý nhanh: siêu liên kết "Mẫu" ở trên thiếu "s" cuối cùng (nên http://code.google.com/p/maven-android-plugin/wiki/Samples). SO sẽ không cho phép tôi chỉnh sửa 1 ký tự. –

1

Phạm vi không được là provided. Được cung cấp có nghĩa là:

cung cấp - điều này giống như biên dịch, nhưng cho biết bạn mong đợi JDK hoặc thùng chứa để cung cấp trong thời gian chạy. Nó chỉ có sẵn trên đường biên tập và đường dẫn thử nghiệm và không phải là chuyển tiếp.

Sử dụng compile để thay thế.

Mẹo bổ sung: Vì compile là mặc định, bạn có thể xóa dòng <scope>provided</scope>.

+0

Vui lòng lưu ý rằng - bằng cách sử dụng mặc định 'biên dịch', tôi nhận được lỗi nhập trùng lặp khi cố gắng tạo .apk. Rõ ràng là tôi có một đặc tả phụ thuộc ở đâu đó, nhưng tôi không chắc chắn ở đâu - tôi đã cố gắng loại bỏ dự án khỏi đường dẫn xây dựng trong nhật thực, không chắc chắn những gì khác để thử. –

+0

@BryM. điều này có thể do sự phụ thuộc trong cocos2d_android đã tồn tại trong thư viện Android. Bạn có thể tìm thấy lớp trùng lặp trong classpath của bạn và sử dụng thẻ phụ thuộc Maven để loại bỏ phụ thuộc thừa từ cocos2d_android. –

Các vấn đề liên quan