2014-06-19 26 views
5

Chúng tôi đang sử dụng Android Studio 0.6.1 với plugin Gradle 0.11. + Trong dự án hiện tại của chúng tôi và chúng tôi đang gặp phải sự cố phụ thuộc với commons-codec. Chúng tôi đang kéo trong một lớp học phụ thuộc từ dụ Artifactory địa phương của chúng tôi có chứa một "crypto" dịch vụ có sử dụng hai dòng mã sau đây:Vấn đề phụ thuộc Base64 trong Android Studio

byte[] encryptedOutput = cipherFactory.getEncryptCipher().doFinal(plaintext.getBytes()); 
byte[] encryptedCipherText = Base64.encodeBase64URLSafe(encryptedOutput); 

Vấn đề là ngay cả khi chúng ta định nghĩa một sự phụ thuộc cụ thể của commons-codec trong cấu hình Gradle của chúng tôi, chúng tôi nhận được ngoại lệ sau đây

java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.encodeBase64URLSafe 

Lúc đầu, chúng tôi đã bằng tay trong đó có một phụ thuộc cho 'commons-codec: commons-codec: 1.9', nhưng theo Android Studio khi tôi đi sâu vào các mã trong IDE, nó đang xem xét phiên bản của phương thức đó trong phiên bản 1.9, nhưng khi ứng dụng chạy, chúng tôi nhận được ngoại lệ. Thậm chí thay đổi sự phụ thuộc vào 1.4 nó vẫn không thành công, mặc dù theo Javadocs đó là khi phương thức đó đã có sẵn. Ngay cả việc loại bỏ sự phụ thuộc thủ công hoàn toàn cũng khiến cho điều tương tự xảy ra.

Có cách nào tôi có thể tìm ra nơi ứng dụng đang chạy đang kéo phụ thuộc này từ đâu không? Đây là danh sách phụ thuộc hoàn toàn của chúng tôi vào lúc này, và tôi không thể tìm thấy commons-codec từ bất kỳ các

compile files('libs/HockeySDK-3.0.2.jar') 
compile files('libs/PushIOManager.jar') 
compile 'commons-lang:commons-lang:[email protected]' 
compile 'org.codehaus.jackson:jackson-core-asl:[email protected]' 
compile 'org.codehaus.jackson:jackson-mapper-asl:[email protected]' 
compile 'com.google.android.gms:play-services:4.4.52' 
compile 'com.mcxiaoke.volley:library:1.0.4' 
compile 'fr.avianey:facebook-android-api:[email protected]' 
compile 'javax.validation:validation-api:1.0.0.GA' 

sợ hãi của tôi là lớp này được chôn cất ở đâu đó với Android SDK và chúng tôi sẽ không có cách nào để ghi đè sử dụng phiên bản commons-codec để cho phép chúng tôi sử dụng thư viện của mình. Và ngay cả khi chúng tôi có thể làm điều đó, tôi lo ngại làm như vậy có thể gây ra một số vấn đề cơ bản với chính Android. Chúng ta có thể (và hiện tại) có nguồn cho lớp dịch vụ mã hóa được đưa vào ứng dụng của chúng ta và tinh chỉnh nó để sử dụng tương đương phù hợp, nhưng điều này có nghĩa là bất cứ khi nào chúng ta thực hiện thay đổi cho một hoặc phiên bản khác, chúng ta phải giữ chúng đồng bộ.

Bất kỳ ý tưởng nào?

CẬP NHẬT: Điều gì dường như hoạt động trong trường hợp cụ thể này là quét các phụ thuộc trong tệp Gradle xây dựng và sau khi tìm thấy phụ thuộc bạn đang tìm kiếm, ghi đè bằng phiên bản bạn muốn sử dụng. Ví dụ:

def versionOverrides = [ 
    "commons-codec:commons-codec": "1.9", 
] 

subprojects { 
    configurations.all { 
     resolutionStrategy.eachDependency { DependencyResolveDetails details -> 

      def overrideVersion = versionOverrides[details.requested.group + ":" + details.requested.name] 

      if (overrideVersion != null && details.requested.version != overrideVersion) { 
       logger.info "Overriding dependency ${details.requested.group}:${details.requested.name} version ${details.requested.version} --> $overrideVersion" 
       details.useVersion overrideVersion 
      } 
     } 
    } 
} 
+0

Thử 'phụ thuộc gradle' –

Trả lời

1

sợ hãi của tôi là lớp này được chôn cất ở đâu đó với SDK Android và chúng tôi sẽ không có cách nào để ghi đè lên nó để sử dụng một phiên bản của commons-codec mà sẽ cho phép chúng ta sử dụng của chúng tôi thư viện.

Đây chính xác là những gì đang diễn ra.
Trình nạp lớp khởi động được nạp sẵn các lớp từ phiên bản 1.3 của thư viện Commons Codec.

Bạn có thể đóng gói lại (đổi tên gói/không gian tên của lớp) thư viện Codec của Commons để tránh xung đột này. Xem câu trả lời của tôi here để biết mô tả chi tiết hơn.

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