带有Maven项目的GitHub缓存在子目录中

问题描述

我对一个简单的Maven项目的GH Action工作流程进行了以下配置。

name: Java CI

on:
  pull_request:
    branches:
      - master

jobs:
  tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: 11
      - name: Cache Maven repository
        uses: actions/cache@v2
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: |
            ${{ runner.os }}-maven-
      - name: Verify with Maven
        run: mvn -B -e -ff clean verify

一切正常,直到我将Maven项目移至code子目录:

name: Java CI

on:
  pull_request:
    paths:
      - code/**
    branches:
      - master

jobs:
  tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: 11
      - name: Cache Maven repository
        uses: actions/cache@v2
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: |
            ${{ runner.os }}-maven-
      - name: Verify with Maven
        run: mvn -B -e -ff clean verify --file code/pom.xml

现在在日志中,我看到缓存步骤显示Cache not found for input keys: Linux-maven-xxxxxxx,Linux-maven-

有人知道为什么缓存不能在子目录中与项目一起工作吗? 谢谢。

解决方法

检查以确保您没有覆盖settings.yaml文件中的localRepository。无论您将项目目录放在何处,Maven都将使用默认的本地存储库~/.m2/repository

作为测试,如果您当前未覆盖默认的本地Maven回购目录,则可以尝试更改工件的Maven存储库路径

在作业开始之前将以下env变量添加到您的工作流中

  env: 
     MAVEN_OPTS: "-Dmaven.repo.local=${{ github.workspace }}/repository"

然后使用以下内容调用缓存操作

  - name: Cache Maven repository
    uses: actions/cache@v2
    with:
      path: "${{ github.workspace }}/repository"
      key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
      restore-keys: |
        ${{ runner.os }}-maven-

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...