2013-06-19 28 views
6

Tôi đang di chuyển dự án Maven sang Gradle. Tôi cần quản lý phụ thuộc rất tryed resolutionStrategy như vậy:Sự phụ thuộc của GradleManagement

def dependencyVersions = [ 
       'org.slf4j:slf4j-api' : '1.7.2', 
       'javax.inject:javax.inject' : '1', 
       'com.google.code.findbugs:annotations' : '2.0.1', 
       'com.typesafe:config' : '1.0.0', 
       'ch.qos.logback:logback-classic' : '1.0.9', 
       'com.google.guava:guava' : '14.0', 
       'com.google.inject:guice' : '3.0', 
       'com.google.inject.extensions:guice-multibindings' : '3.0', 
       'com.google.code.gson:gson' : '2.2.2', 
       'joda-time:joda-time' : '2.1', 
       'com.thoughtworks.paranamer:paranamer' : '2.5.2', 
       'org.codehaus.groovy:groovy-all' : '2.0.6', 
       'commons-validator:commons-validator': '1.4.0', 
       'org.apache.shiro:shiro-core' : '1.2.1', 
       'junit:junit-dep' : '4.10', 
       'org.mockito:mockito-core' : '1.9.5', 
       'org.hamcrest:hamcrest-core': '1.3', 
       'org.hamcrest:hamcrest-library': '1.3', 
       'org.unitils:unitils-core': '3.3' 
      ] 

configurations.all { 
    resolutionStrategy { 
     eachDependency { DependencyResolveDetails details -> 
     def version = dependencyVersions["$details.requested.group:$details.requested.name"] 
     if (version != null) 
      details.useVersion version 
     } 
    } 
} 

nhưng bây giờ khi tôi cố gắng Gradle cài đặt (vào kho Maven địa phương) Tôi nhận được lỗi này:

Execution failed for task ':counter-module:install'. 

Could not publish configuration 'archives' Unable to initialize POM pom-default.xml: Failed to validate POM for project lt.counter at /home/workspace/counter/counter-module/build/poms/pom-default.xml

+0

Tôi tin rằng bạn đang tìm kiếm điều này: http://stackoverflow.com/questions/9547170/in-gradle-how-do-i-declare-common-dependencies-in-a-single-place là cách thứ ba khi tìm kiếm stackoverflow cho văn bản chính xác của tiêu đề câu hỏi của bạn ... –

+0

Nhưng cách này không bắt buộc phải sử dụng phiên bản chính xác mà bạn muốn, nếu tôi đang sử dụng phiên bản phụ thuộc N và phụ thuộc khác của tôi sử dụng phiên bản phụ thuộc đó N- 1 Tôi sẽ bị xung đột. Tôi cần phải ép buộc tất cả các phụ thuộc của tôi sử dụng phiên bản N. – IowA

+0

Ah, tôi hiểu rồi. Có, kỹ thuật bản đồ thực sự thuận tiện hơn và DRY. Nếu bạn không thể tin tưởng dev của bạn (và ai có thể ?: P) bạn sẽ muốn độ phân giải phụ thuộc, như bạn đang cố gắng. Thật không may tôi không có kinh nghiệm trực tiếp với điều đó. –

Trả lời

4

Tôi vẫn có thể thiếu một khía cạnh của sự cố của bạn, nhưng tôi vừa mới nhận thấy điều gì đó trong tài liệu.

// force certain versions of dependencies (including transitive) 
// *append new forced modules: 
force 'asm:asm-all:3.3.1', 'commons-io:commons-io:1.4' 
// *replace existing forced modules with new ones: 
forcedModules = ['asm:asm-all:3.3.1'] 

Nó có vẻ như bạn có thể làm như sau:

def dependencyVersions = [ 
      'org.slf4j:slf4j-api' : '1.7.2', 
      'javax.inject:javax.inject' : '1', 
      'com.google.code.findbugs:annotations' : '2.0.1', 
      'com.typesafe:config' : '1.0.0', 
      'ch.qos.logback:logback-classic' : '1.0.9', 
      'com.google.guava:guava' : '14.0', 
      'com.google.inject:guice' : '3.0', 
      'com.google.inject.extensions:guice-multibindings' : '3.0', 
      'com.google.code.gson:gson' : '2.2.2', 
      'joda-time:joda-time' : '2.1', 
      'com.thoughtworks.paranamer:paranamer' : '2.5.2', 
      'org.codehaus.groovy:groovy-all' : '2.0.6', 
      'commons-validator:commons-validator': '1.4.0', 
      'org.apache.shiro:shiro-core' : '1.2.1', 
      'junit:junit-dep' : '4.10', 
      'org.mockito:mockito-core' : '1.9.5', 
      'org.hamcrest:hamcrest-core': '1.3', 
      'org.hamcrest:hamcrest-library': '1.3', 
      'org.unitils:unitils-core': '3.3' 
     ] 

force dependencyVersion.collect {k, v -> "$k:$v"} 

Để đôi mắt của tôi, nó trông như thế này sẽ thực hiện hai nguyên tắc.

  1. Cung cấp cho người dùng ký hiệu bản đồ đẹp để sử dụng khi họ muốn chơi đẹp và thêm dấu ấn với phiên bản được xác định trước của bạn.
  2. Buộc họ sử dụng phiên bản được xác định trước bất cứ lúc nào họ cố gắng để trở nên khó khăn.
+0

Vấn đề ở đây là plugin Maven đang tạo tệp mặc định-pom.xml và không thấy phiên bản. Và sau đó nó không thành công khi cố gắng để xác nhận pom mà không có bất kỳ phiên bản phụ thuộc – IowA

+0

Tôi không thấy kết nối rõ ràng giữa câu trả lời của tôi và bình luận của bạn. (Có lẽ quá sớm đối với tôi?: P) Bạn có nói rằng thông báo lỗi từ câu hỏi của bạn hóa ra là một vấn đề với tạo tác giả (phần pom) và độ phân giải phụ thuộc không? –

0

Độ phân giải mặc định chiến lược cho Gradle là sử dụng phiên bản mới nhất, vì vậy phiên bản N sẽ được sử dụng; phiên bản N-1 sẽ không.

Bạn không cho chúng tôi biết phiên bản Gradle bạn đang sử dụng và cấu trúc đầy đủ của (các) dự án của bạn. Bạn đang làm một dự án đa dự án?

Ngoài ra, tôi không hiểu chiến lược phân giải tùy chỉnh của bạn - tại sao phiên bản này sẽ là rỗng?

- chỉnh sửa -

Phiên bản mới nhất là chiến lược phân giải mặc định, vì vậy, phiên bản cao nhất gặp phải sẽ được sử dụng.

Có thể xem Gradle's examples on custom resolution strategies, chẳng hạn như buộc một phiên bản cụ thể.

+0

Có điều này là xây dựng mô-đun đa. Tôi đang sử dụng Gradle 1.6. Và điều này không chỉ cần cho N và N-1, nhưng điều gì sẽ xảy ra nếu một số phụ thuộc phụ thuộc vào N + 1? hơn Gradle sẽ sử dụng phiên bản N + 1 cho tất cả các Dependencies? – IowA

+0

Vì anh ta (cô ấy?) Nhận được phiên bản trên bản đồ của các phụ thuộc hữu hạn, tôi giả sử phiên bản sẽ là null khi giải quyết sự phụ thuộc mà anh ta không có phiên bản cụ thể nào được đặt cho. –

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