【问题标题】:How to distribute a JAR file with Classes to other developers? [closed]如何将带有类的 JAR 文件分发给其他开发人员? [关闭]
【发布时间】:2020-05-16 06:56:26
【问题描述】:

我需要将一些已编译的 JAVA 类分发给另一个开发团队。所以我可以 JAR 编译的类。

不过,我的 Java 类也依赖于库 A、B 和 C。

最专业的方法是什么?

  • 如何在 gradle 项目中包含位于文件系统某处的自定义 JAR 文件?

以及如何与其他开发团队沟通依赖关系:

  • “编译”所有依赖项到我的 JAR 中。但是,这可能会导致(版本)冲突。
  • 为普通 JAR 提供我自己的 JAR 文件,并提供一个 Gradle sn-p 及其应包含在 Gradle 项目中的依赖项(或 ANT/Maven 或只是他们使用的)。

有没有办法:

  • 编写一个 Gradle 文件,将 JAR 拉入本地文件系统,以及所有依赖项,例如通过在 gradle 文件中描述它们?
  • 在编译的 JAR 文件(“自我描述”JAR 文件)中包含一个 Gradle/Manifest 文件,Gradle 会自动读取该文件并自动获取所有依赖项?

处理这个问题的最佳方法是什么?

【问题讨论】:

  • 真正最好的方法是为开发人员提供源代码,以便他们自己构建! (也是最专业的,IMO)
  • “编译”所有依赖项到我的 JAR 中。这是最好的方法之一。其他开发人员不必担心其他库的版本。即使这些库有任何新版本,您自己的类文件也知道要依赖哪个版本。
  • 或者更好的是,设置一个源代码存储库和一个工件存储库存储库来保存 JAR 文件等。并让其他团队访问该存储库。
  • @Sara - 这是向非开发人员客户交付代码的好方法。但是开发人员需要知道依赖是什么,并且(通常)有能力修补它们。并且能够访问源代码将使他们更容易调试代码并发现/报告代码中的错误!
  • 我建议遵循 Oracle 在分发时遵循的方式。实际类及其依赖项的单独 jar 和源文件的另一个 jar。

标签: java maven gradle


【解决方案1】:

最专业的方法是什么?

推荐的方法是使用Maven Repository Manager,例如Sonatype Nexus

确保你configure a single repository group

然后,如果您使用的是 Gradle 等其他构建工具,您可以使用 mvn clean deploy(使用 Maven)或类似的工具部署您的 SNAPSHOT 和发布工件。

确保您还部署了源 jar,以便开发人员可以轻松地从他们的 IDE 中访问源。

使用 Maven:

<pluginManagement>
    <plugins>
      [...]
      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-source-plugin</artifactId>
         <version>3.2.1</version>
      </plugin>
      [...]
    </plugins>
</pluginManagement>

<plugins>
   [...]
   <plugin>
        <artifactId>maven-source-plugin</artifactId>
        <executions>
          <execution>
            <id>attach-sources</id>
            <goals>
              <goal>jar-no-fork</goal>
            </goals>
          </execution>
        </executions>
   </plugin>
   [...]
</plugins> 

只要部署的 pom.xml 文件声明所有依赖项,支持 Maven 依赖项的构建工具将确保它们也下载所有传递依赖项。

【讨论】:

    【解决方案2】:

    您需要一个人工制品管理器,例如 artifactory (https://jfrog.com/open-source/)。

    然后您可以编写一个 gradle 脚本来构建您的 jar,并将其连同其所有依赖项一起发布到工件服务器。如果依赖项是公开可用的,则无需发布它们,因为工件服务器将具有指向在线存储库(例如 jcenter、mavencentral)的链接。 https://www.jfrog.com/confluence/display/JFROG/Gradle+Artifactory+Plugin

    plugins {
       id 'maven-publish'
       id "com.jfrog.artifactory" version "4.15.2"
    }
    
    artifactory {
        contextUrl = "http://repo.mycompany.com/artifactory"
        publish {
            repository {
                repoKey = 'libs-snapshot-local'
                username = "${artifactory_user}"
                password = "${artifactory_password}"
                maven = true
    
            }       
            defaults {
                publications ('mavenJava')
            }
        }
    }
    
    publishing {
        publications {
            mavenJava(MavenPublication) {
               groupId = 'com.mycompany'
               artifactId = 'myproject'
               version = '1.0'
               from components.java
            }
        }
    }
    

    然后,您的同事可以编写一个 maven 或 gradle 脚本来指定该 jar 并下载它,以及它的所有依赖项。

    repositories {
        maven {
            url "http://repo.mycompany.com/artifactory"
        }
    }
    
    dependencies {
        implementation group: 'com.mycompany', name: 'myproject', version:'1.0'
    }
    

    这种依赖管理是 maven 和 gradle 等构建工具的用途。

    【讨论】:

      【解决方案3】:

      一种方法是:
      使用您要共享的所有源文件创建服务。将此服务命名为“developer-dependency-sdk”。
      您的此服务的 POM 将如下所示:

      <groupId>your.company</groupId>
      <artifactId>developer-dependency-sdk</artifactId>
      <version>1.0.0-SNAPSHOT</version>
      <packaging>pom</packaging>
      
      <distributionManagement>
          <repository>
              <id>project-id</id>
              <url>http://your_repository/server</url>
          </repository>
      </distributionManagement>
      

      现在,任何其他项目都可以将其项目映像中的映像用作依赖项:

       <pluginRepositories>
          <pluginRepository>
            <id>project-id</id>
            <name>Dependency Repository</name>
            <url>https://your_repository/server</url>
            <layout>default</layout>
            <snapshots>
              <enabled>false</enabled>
            </snapshots>
            <releases>
              <updatePolicy>never</updatePolicy>
            </releases>
          </pluginRepository>
        </pluginRepositories>
      

      上面的 POM 部分将告诉您当前的项目从提供的 URL 中选择依赖项。在此之后,您可以简单地添加您的依赖项。 查看此link 了解更多详情。

      【讨论】:

        猜你喜欢
        • 2017-06-17
        • 1970-01-01
        • 1970-01-01
        • 2016-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多