4.5.2. 创建应用程序组件

如果正在开发可复用的应用程序组件,本节包含一些有用的建议。

命名规则
  1. 使用标准的反转域名表示法选择根 java 包,例如 com.jupiter.amazingsearch

    根包不应该以任何其它组件或应用程序的根包开头。例如,如果有一个带有 com.jupiter.tickets 根包的应用程序,则不能将 com.jupiter.tickets.amazingsearch 包用于组件。原因是 Spring 从指定的根包开始扫描 bean 的类路径,并且每个组件的扫描空间必须是唯一的。

  2. 命名空间用作数据库表的前缀,因此对于公共组件,应该是一个表示综合含义的单词(或缩写),如 jptams,而不仅仅是 search。这样可以将目标应用程序中命名冲突的风险降到最低。不能在命名空间中使用下划线和短横,只能使用字母和数字。

  3. 模块前缀应该与命名空间名称一致,但可以包含短横,如 jpt-amsearch

  4. 使用命名空间作为 bean 名称和应用程序属性的前缀,例如:

    @Component("jptams_Finder")
    @Property("jptams.ignoreCase")
安装到本地 Maven 仓库

要使组件可用于本地计算机上的项目,请通过执行 CUBA > Advanced > Install app component 主命令将其安装到本地 Maven 仓库中。这个命令实际上只是在停止 Gradle 守护进程之后运行 install Gradle 任务。

上传到远程 Maven 仓库
  1. 按照安装配置私仓中的说明设置私仓。

  2. 指定项目的仓库和凭证,由于使用私仓,此处不能设置标准 CUBA 仓库。

  3. 在文本编辑器中打开组件项目的 build.gradle,并将 uploadRepository 添加到 cuba 部分:

    cuba {
        //...
        // repository for uploading your artifacts
        uploadRepository {
            url = 'http://repo.company.com/nexus/content/repositories/snapshots'
            user = 'admin'
            password = 'admin123'
        }
    }
  4. 在 Studio 中打开组件项目。

  5. 从命令行运行 uploadArchives Gradle 任务。组件的工件将被上传到仓库。

  6. 从本地 Maven 仓库中删除组件工件,以确保在下一次装载应用程序项目时会从远程仓库下载组件:只需删除位于用户主目录中的 .m2/repository/com/company 文件夹。

  7. 现在,当装载并运行使用此组件的应用程序时,将从远程仓库中下载依赖的扩展组件。

上传到 Bintray
  1. 首先,在 https://bintray.com/signup/oss 注册账号

    可以在 Bintray 上使用社交账户登录(GitHub,Gmail,Twitter),但稍后必须重置密码,因为获取 API 密钥需要此帐户的密码(见下文)。

  2. 获取 Bintray 用户名。可以在登录 Bintray 后看到的 URL 中找到。例如,在 https://bintray.com/vividphoenix 中,vividphoenix 是用户名。

  3. 获取 API 密钥。可以在 Bintray 编辑个人资料界面中找到。在 API 密钥部分,系统会要求输入帐户密码以获取密钥。然后,将能够使用此密钥和用户名进行 Bintray 的 Gradle 插件验证:

    • Bintray 凭证可以添加为环境变量:

      BINTRAY_USER=your_bintray_user
      BINTRAY_API_KEY=9696c1cb90752357ded8fdf20eb3fa921bf9dbbb
    • 除了环境变量,也可以在项目的 build.gradle 文件中显式定义这些参数:

      bintray {
          user = 'bintray_user'
          key = 'bintray_api_key'
          ...
      }
    • 或者,可以在命令行中提供 Bintray 凭据的参数:

      ./gradlew clean assemble bintrayUpload -Pcuba.artifact.version=1.0.0 -PbintrayUser=your_bintray_user -PbintrayApiKey=9696c1cb90752357ded8fdf20eb3fa921bf9dbbb
  4. 创建 Maven 类型的公共仓库。对于开源(OSS)仓库,必须设置许可证类型。

    Bintray 会隐式的使用仓库内的包。此时,还不是必须要创建组件包,因为在之后的 gradle bintrayUpload 任务会自动创建。

  5. build.gradle 中,添加 Bintray 上传插件的依赖如下:

    buildscript {
        // ...
        dependencies {
            classpath "com.haulmont.gradle:cuba-plugin:$cubaVersion"
            // Bintray upload plugin
            classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.0"
        }
    }
  6. build.gradle 结尾,添加 Bintray 插件设置:

    /** * If you have a multi-project build, make sure to apply the plugin and the plugin configuration to every project which artifacts you want to publish to Bintray. */
    subprojects {
        apply plugin: 'com.jfrog.bintray'
    
        bintray {
            user = project.hasProperty('bintrayUser') ? project.property('bintrayUser') : System.getenv('BINTRAY_USER')
            key = project.hasProperty('bintrayApiKey') ? project.property('bintrayApiKey') : System.getenv('BINTRAY_API_KEY')
    
            configurations = ['archives']
    
            // make files public ?
            publish = true
            // override existing artifacts?
            override = false
    
            // metadata
            pkg {
                repo = 'main'           // your repository name
                name = 'amazingsearch'  // package name - it will be created upon upload
                desc = 'AmasingSearch'  // optional package description
    
                // organization name, if your repository is created inside an organization.
                // remove this parameter if you don't have an organization
                userOrg = 'jupiter-org'
    
                websiteUrl = 'https://github.com/jupiter/amazing-search'
                issueTrackerUrl = 'https://github.com/jupiter/amazing-search/issues'
                vcsUrl = 'https://github.com/jupiter/amazing-search.git' // mandatory for Open Source projects
    
                licenses = ["Apache-2.0"]
                labels = ['cuba-platform', 'opensource']
    
                //githubRepo = 'amazingsearch/cuba-platform' // optional Github repository
                //githubReleaseNotesFile = 'README.md' // optional Github readme file
            }
        }
    }
    • pkg:repo 是仓库(使用 main),

    • pkg:name 是包名(使用唯一名称,例如 amazingsearch),

    • pkg:desc 将显示在 Bintray 界面上的可选组件包描述,

    • pkg:userOrg - 是仓库所属组织的名称(如果没有设置,默认情况下 BINTRAY_USER 将用作组织名称)。

  7. 现在,可以使用以下命令构建和上传项目:

    ./gradlew clean assemble bintrayUpload -Pcuba.artifact.version=1.0.0
  8. 如果在 CUBA 市场上发布扩展组件,则其仓库将链接到标准 CUBA 仓库,用户不必在其项目中指定仓库。