将库模块集成到另一个项目模块时的 Pom.xml 冲突

Posted

技术标签:

【中文标题】将库模块集成到另一个项目模块时的 Pom.xml 冲突【英文标题】:Pom.xml conflict when integrating library module to another project module 【发布时间】:2020-08-09 17:21:30 【问题描述】:

我正在实现一个封闭源代码的自定义模块/SDK(类似对讲), 根据 maven 在我自己的服务器上使用私人仓库, 并且在 pom.xml 文件中有一个小挑战

问题描述: Pom.xml 文件包含我在任何项目中集成此库/SDK 时在模块中使用的一些依赖项, 不知何故,我的依赖项和项目的依赖项之间存在冲突。 例如 : 我在我的库模块中使用这个依赖项

implementation 'com.google.android.material:material:1.0.0'

以及我尝试使用同一库的最新版本集成的项目

implementation 'com.google.android.material:material:1.2.0'

所以,我有一个编译时错误。我正在尝试使用<dependencyManagement> 标签来解决这个问题,但我没有运气。

另外,我无法指定我的库和打算使用它的项目之间的常见依赖关系。

问题是: 如何克服冲突问题。 我希望我的库模块使用这个依赖的 1.0.0 版本,而另一个项目使用它的 1.2.0 版本而没有冲突。

Edit-1 下面是我的库中用于生成 pom.xml 文件的代码:

publishing 
    publications 
        aar(MavenPublication) 
            groupId libraryGroupId
            version libraryVersion
            artifactId libraryArtifactId
            artifact androidJavadocsJar
            artifact androidSourcesJar
            artifact("$buildDir/outputs/aar/$artifactId-release.aar")
            pom.withXml 
                def dependenciesNode = asNode().appendNode('dependencies')
                for(int i = 1 ; i < configurations.implementation.allDependencies.size() ; i++)
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId',
                            configurations.implementation.allDependencies[i].group)
                    dependencyNode.appendNode('artifactId',
                            configurations.implementation.allDependencies[i].name)
                    dependencyNode.appendNode('version',
                            configurations.implementation.allDependencies[i].version)
                
            
        
    

Edit-2(附上pom.xml文件)

  <dependencies>
    <dependency>
      <groupId>androidx.appcompat</groupId>
      <artifactId>appcompat</artifactId>
      <version>1.1.0</version>
    </dependency>
    <dependency>
      <groupId>androidx.constraintlayout</groupId>
      <artifactId>constraintlayout</artifactId>
      <version>1.1.3</version>
    </dependency>
    <dependency>
      <groupId>androidx.legacy</groupId>
      <artifactId>legacy-support-v4</artifactId>
      <version>1.0.0</version>
    </dependency>
    <dependency>
      <groupId>androidx.vectordrawable</groupId>
      <artifactId>vectordrawable-animated</artifactId>
      <version>1.1.0</version>
    </dependency>
    <dependency>
      <groupId>com.google.android.material</groupId>
      <artifactId>material</artifactId>
      <version>1.0.0</version>
    </dependency>
    <dependency>
      <groupId>org.java-websocket</groupId>
      <artifactId>Java-WebSocket</artifactId>
      <version>1.5.1</version>
    </dependency>
    <dependency>
      <groupId>com.google.android.exoplayer</groupId>
      <artifactId>exoplayer</artifactId>
      <version>2.11.5</version>
    </dependency>
  </dependencies>

【问题讨论】:

我建议使用com.google.android.material:material:1.2.0 来解决问题。 @khmarbaise:感谢您的重播,实际上问题有点复杂,库/SDK已经使用特定的依赖项内置,implementation 'com.google.android.material:material:1.0.0'只是一个例子,我也没有了解其他开发人员将在他们的项目中使用的依赖项以及它们与我的不同之处。 (查看我的 edit-2 以获取完整的 pom.xml 文件) 对此的简单回答:根据给出的版本,它表明这些库不遵循语义版本。而且我看不到真正的解决方案,要么您决定使用 1.2.0 版本,而且生成的 botter 工件的结果版本应该更改为其他版本,如 2.0.0 因为它与以前的版本不兼容 @987654330 @ 从语义版本的角度来看只是一个补丁......但是将依赖项的 1.0.0 版本升级到 1.2.0 会产生失败...... 如果其他项目将来使用更高版本的exo-player(即2.11.6)会发生问题,它会与我使用的版本(2.11.5)产生冲突。我说的对吗? 我怎么知道?如果是这样,exo-player 的版本处理完全搞砸了......以及...... 【参考方案1】:

好的,我将把这个答案留在这里,因为任何人都可能面临同样的问题。 我没有更改 pom.xml 文件或与库集成的项目中的任何内容。

我刚刚意识到,我应该改变谷歌芯片的主题(它使用材料依赖),如下所示:

<com.google.android.material.chip.Chip
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    style="@style/Widget.MaterialComponents.Chip.Action"
    <!-- Add the below line -->
    android:theme="@style/Theme.MaterialComponents.Light"
    android:layout_
    android:layout_
    android:gravity="center"
    android:textAppearance="?android:attr/textAppearance"
    android:textColor="@color/colorChatAccent"
    app:chipBackgroundColor="@android:color/white"
    app:chipCornerRadius="@dimen/dimen_5"
    app:chipStrokeColor="@color/colorChatAccent"
    app:chipStrokeWidth="@dimen/dimen_1" /> 

所以,问题不在 pox.xml 中,而是在 Chip 主题中。

【讨论】:

以上是关于将库模块集成到另一个项目模块时的 Pom.xml 冲突的主要内容,如果未能解决你的问题,请参考以下文章

Maven 多模块web项目如何集成到tomcat里面去 然后怎么运行?

pom.xml导入子模块失败

是否可以将多模块 pom 作为父多模块 pom 的模块?

Scala多模块项目?

IDEA 搭建多模块SpringBoot 项目:集成MyBatisDruidDubbo

如何在 Maven 多模块项目中仅运行父 pom.xml