如何在 Grails 应用程序中使用 Nexus 而不是 Maven

How to use Nexus instead of maven for Grails app

我有一个 grails 2.5.3 应用程序,它使用来自 maven 的插件和依赖项。现在我想在公司内部使用 Nexus 服务器设置作为我的应用程序使用的所有依赖项的代理。但是,我以前从未使用过 Nexus,所以我对它的工作原理有点困惑。

我使用 grails create-pom com.mycompany 为我的 grails 应用程序生成了 POM.xml。生成的pom有如下artifactId

<groupId>com.mycompany</groupId>
<artifactId>myproj</artifactId>
<packaging>grails-app</packaging>
<version>1.0.0.R1</version>

然后我将以下内容添加到 POM.xml

  <distributionManagement>
    <repository>
      <id>nexus</id>
      <name>Nexus Repo</name>
      <url>https://companynextus/content/repositories/myproj</url>
    </repository>
  </distributionManagement>

那我运行mvn deploy

现在我可以在 https://companynextus/content/repositories/myproj/com/mycompany/myproj/1.0.0.R1/

看到我的整个 WAR 文件和 POM

此时我只是将我的 BuildConfig.groovy 更改为:

repositories {
    inherits true // Whether to inherit repository definitions from plugins

    grailsPlugins()
    grailsHome()
    mavenLocal()
    grailsCentral()
    mavenCentral()
}

收件人:

repositories {
    inherits true // Whether to inherit repository definitions from plugins

    grailsPlugins()
    grailsHome()
    grailsRepo "https://companynextus/content/repositories/myproj/com/mycompany/myproj/1.0.0.R1"
    mavenRepo "https://companynextus/content/repositories/myproj/com/mycompany/myproj/1.0.0.R1"
}

但是我在做 grails prod war

时出错

Resolve error obtaining dependencies: Could not find artifact org.grails.plugins:tomcat:zip:8.0.33 in https://companynextus/content/repositories/myproj/com/mycompany/myproj/1.0.0.R1(https://companynextus/content/repositories/myproj/com/mycompany/myproj/1.0.0.R1) (Use --stacktrace to see the full trace)

当你执行 mvn deploy 命令时,它会将你的项目作为 jar 文件上传到 nexus 存储库,但不会单独上传每个依赖项,如果你想从 nexus 下载和使用项目依赖项,你需要上传也依赖于关系。

有关如何将第 3 方 jar 上传到像 nexus 这样的存储库的更多信息 https://maven.apache.org/guides/mini/guide-3rd-party-jars-remote.html

如果您使用 nexus 2,您也可以从 ui 执行此操作。

我们创建了一个 nexus 存储库组 (http://nexushost/content/groups/repo),它缓存所有外部 maven 存储库(maven central、grails 存储库),以及我们的内部发布存储库。

至于部署,我们有一个快照存储库 (http://nexushost/content/repositories/snapshots), and one repo for releases (http://nexushost/content/repositories/releases/)。

这是我们使用 Grails 2.5.1 构建配置的摘录。应该和你的版本差别不大:

def env = System.getenv() + new HashMap(System.properties)

grails {
    project {
        repos {
            SNAPSHOTS {
                url = "http://nexushost/content/repositories/snapshots"
                username = env.NEXUS_DEPLOY
                password = env.NEXUS_DEPLOY_PASS
            }
            RELEASES {
                url = "http://nexushost/content/repositories/releases/"
                username = env.NEXUS_DEPLOY
                password = env.NEXUS_DEPLOY_PASS
            }
        }
    }
}


grails.project.dependency.resolver = "maven" 
grails.project.dependency.resolution = {
    inherits("global") {
    }
    repositories {
        inherits true

        mavenLocal()
        mavenRepo('http://nexushost/content/groups/repo') {
            auth(
                    username: env.NEXUS_BUILD,
                    password: env.NEXUS_BUILD_PASS
            )
        }
        mavenRepo('http://nexushost/content/repositories/snapshots') {
            auth(
                    username: env.NEXUS_BUILD,
                    password: env.NEXUS_BUILD_PASS
            )
            updatePolicy 'always'
        }
    }

//....
}