78392


現在、MavenプロジェクトへGitHub
Actionsを用いてCIを導入しようとしているのですが、下記のようなワークフローのymlファイルでビルドを行うと、テストコードの部分でビルドエラーが発生し、ビルドが出来ない状態でおります。

[code]

    # This workflow will build a Java project with Maven
    # For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
    
    name: Java CI with Maven
    
    on:
      push:
        branches: [ main ]
      pull_request:
        branches: [ main ]
    
    jobs:
      build:
    
        runs-on: ubuntu-latest
    
        steps:
        - uses: actions/checkout@v2
        - name: Set up JDK 8
          uses: actions/setup-java@v2
          with:
            java-version: '8'
            distribution: 'adopt'
        - name: Build with Maven
          run: mvn -B package --file pom.xml
    
[/code]

エラー内容は下記のように、`package org.junit does not exist`と、ユニットテストのあるクラスにおいて`cannot find
symbol`となってしまっているので、上記のymlのワークフローで実行している、`mvn -B package --file
pom.xml`のMavenプロジェクトのビルド時に、JUnitのライブラリのパッケージ読み込みに問題が発生しているものと推測しております。

[code]

    2021-07-24T12:09:35.1081503Z [INFO] 24 errors 
    2021-07-24T12:09:35.1082509Z [INFO] -------------------------------------------------------------
    2021-07-24T12:09:35.1083403Z [INFO] ------------------------------------------------------------------------
    2021-07-24T12:09:35.1084179Z [INFO] BUILD FAILURE
    2021-07-24T12:09:35.1084978Z [INFO] ------------------------------------------------------------------------
    2021-07-24T12:09:35.1116178Z [INFO] Total time:  8.300 s
    2021-07-24T12:09:35.1118245Z [INFO] Finished at: 2021-07-24T12:09:35Z
    2021-07-24T12:09:35.1132705Z [INFO] ------------------------------------------------------------------------
    2021-07-24T12:09:35.1198182Z [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.5.1:compile (default-compile) on project food_share_web: Compilation failure: Compilation failure: 
    2021-07-24T12:09:35.1201119Z [ERROR] /home/runner/work/food_share_web/food_share_web/src/test/TestTimestampUtil.java:[3,24] package org.junit does not exist
    2021-07-24T12:09:35.1203527Z [ERROR] /home/runner/work/food_share_web/food_share_web/src/test/TestTimestampUtil.java:[7,17] package org.junit does not exist
    2021-07-24T12:09:35.1205781Z [ERROR] /home/runner/work/food_share_web/food_share_web/src/test/TestTimestampUtil.java:[29,10] cannot find symbol
    2021-07-24T12:09:35.1207252Z [ERROR]   symbol:   class Test
    2021-07-24T12:09:35.1208255Z [ERROR]   location: class test.TestTimestampUtil
    
[/code]

色々と試してみた結果、下記の`pom.xml`にて定義している`<dependencies>`の中の`junit`の項目の`<scope>test</scope>`の部分を削除することで、warファイルのビルドが成功することが出来ました。

[code]

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>jp.example</groupId>
        <artifactId>food_share_web</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>war</packaging>
        <build>
            <sourceDirectory>src</sourceDirectory>
            <plugins>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.5.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>3.0.0</version>
                    <configuration>
                        <warSourceDirectory>WebContent</warSourceDirectory>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>com.heroku.sdk</groupId>
                    <artifactId>heroku-maven-plugin</artifactId>
                    <version>3.0.4</version>
                    <configuration>
                        <appName>${heroku.appName}</appName>
                    </configuration>
                </plugin>
            </plugins>
        </build>
        <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.45</version>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>5.2.13.Final</version>
            </dependency>
            <dependency>
                <groupId>org.apache.taglibs</groupId>
                <artifactId>taglibs-standard-impl</artifactId>
                <version>1.2.5</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet.jsp.jstl</groupId>
                <artifactId>javax.servlet.jsp.jstl-api</artifactId>
                <version>1.2.1</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
                <version>3.0.1</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.11</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </project>
    
[/code]

しかし、CI実行結果のログをよく見るとユニットテストの実行がスキップされている結果になり、対処療法的な処置になってしまいました。  
CIでのユニットテストの実行がされないのであれば導入した意味がないので、なんとかCIの実行時にユニットテストが動作するようにしたいと思っております。

このビルドエラーの根本的な解決方法について、ご存知の方がおりましたらぜひともご教授いただければ幸いです。

また、上記以外で必要な情報が必要な場合、当然自分からも提供いたしますが、下記のGitHubレポジトリも参考にしていただけたらと思います。  
<https://github.com/Kawboy442/food_share_web/tree/feature/%2395-Setting-up-a-
CI>

よろしくお願いいたします。


CC BY-SA 4.0
2021-07-25T05:47:30.487
78391
2021-08-04T11:59:19.740
2021-08-04T11:59:19.740
3060
36146
question
java maven junit github-actions
Mavenプロジェクトでのテストコードのクラスのビルドエラーの解消法


### 解消方法

`pom.xml` で

[code]

    <testSourceDirectory>test</testSourceDirectory>
    
[/code]

のように設定した後、このディレクトリにテストクラスファイルを移動させることで設定とファイルの置き場所が一致し、`test`
scopeのJUnitにパスが通った状態でコンパイル及びテスト実行されるようになります。

[code]

    mkdir test
    git mv src/test test/
    
[/code]

* * *

### 事象の説明

テストクラスファイル([`src/test/TestTimestampUtil.java`](https://github.com/Kawboy442/food_share_web/blob/5a703f957463c62a098aa1da70f9471800c4ff43/src/test/TestTimestampUtil.java))の置き場所を間違えています。

[`sourceDirectory`](https://github.com/Kawboy442/food_share_web/blob/5a703f957463c62a098aa1da70f9471800c4ff43/pom.xml#L9)で設定している
`src` ディレクトリ配下にあるためテストコードでなく通常のコードとして認識されています。  
このため`test` scopeのライブラリにはパスが通っていない状態でコンパイルされます。

また、`testSourceDirectory`で設定しているディレクトリ配下に存在しないため、テスト時の実行対象になっていません。

なお、Mavenが認識しているテストディレクトリ(`testSourceDirectory`)は[`help:effective-
pom`ゴール](https://maven.apache.org/plugins/maven-help-
plugin/usage.html)を利用して、次のコマンドで確認できます:

[code]

    mvn help:effective-pom | grep testSourceDirectory
    
[/code]

(この結果で分かる通り、デフォルトである `src/test/java` が暗黙的に設定されています。)


CC BY-SA 4.0
2021-07-25T06:55:58.443
78392
2021-07-25T07:17:41.120
2021-07-25T07:17:41.120
2808
2808
78391
answer