Maven 在使用测试范围时无法编译测试-类

Maven cant compile test-classes when using test scope

我目前正在尝试使用 MockBukkit 来测试我的 Minecraft 插件,并将其包含在我的带有测试范围的 pom 中,因为我只需要它。然而,问题是当使用测试范围时,依赖项出现在我的本地存储库中,但无法通过 eclipse 或 Maven 解决。

问题似乎是 compiler 插件的默认编译目标试图编译测试 类 即使它不能使用依赖项,因为它们只在测试阶段可用. (不过这只是我的猜测)。

Maven 输出:

[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ CityCraft ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 32 source files to C:\Users\lptoa\Desktop\MC Plugins\CityCraft\target\classes
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /C:/Users/lptoa/Desktop/MC Plugins/CityCraft/src/test/java/skyvide/de/city/CityTests.java:[3,32] package be.seeseemelk.mockbukkit does not exist
[ERROR] /C:/Users/lptoa/Desktop/MC Plugins/CityCraft/src/test/java/skyvide/de/city/CityTests.java:[4,32] package be.seeseemelk.mockbukkit does not exist
[ERROR] /C:/Users/lptoa/Desktop/MC Plugins/CityCraft/src/test/java/skyvide/de/city/CityTests.java:[9,17] cannot find symbol
  symbol:   class ServerMock
  location: class test.java.skyvide.de.city.CityTests
[ERROR] /C:/Users/lptoa/Desktop/MC Plugins/CityCraft/src/test/java/skyvide/de/city/CityTests.java:[12,10] cannot find symbol
  symbol:   class Before
  location: class test.java.skyvide.de.city.CityTests
[ERROR] /C:/Users/lptoa/Desktop/MC Plugins/CityCraft/src/test/java/skyvide/de/city/CityTests.java:[19,10] cannot find symbol
  symbol:   class After
  location: class test.java.skyvide.de.city.CityTests
[ERROR] /C:/Users/lptoa/Desktop/MC Plugins/CityCraft/src/test/java/skyvide/de/city/CityTests.java:[15,22] cannot find symbol
  symbol:   variable MockBukkit
  location: class test.java.skyvide.de.city.CityTests
[ERROR] /C:/Users/lptoa/Desktop/MC Plugins/CityCraft/src/test/java/skyvide/de/city/CityTests.java:[16,34] cannot find symbol
  symbol:   variable MockBukkit
  location: class test.java.skyvide.de.city.CityTests
[ERROR] /C:/Users/lptoa/Desktop/MC Plugins/CityCraft/src/test/java/skyvide/de/city/CityTests.java:[22,13] cannot find symbol
  symbol:   variable MockBukkit
  location: class test.java.skyvide.de.city.CityTests

地点:

->src
 --->test
    --->java
      --->example
        --->ExampleTest.java

代码:

package test.java.example;

import be.seeseemelk.mockbukkit.MockBukkit;
import be.seeseemelk.mockbukkit.ServerMock;
import main.plugin;

public class ExampleTest {
    
    private ServerMock server;
    private Plugin plugin;

    @Before
    public void setUp()
    {
        server = MockBukkit.mock();
        plugin = (Plugin) MockBukkit.load(Plugin.class);
    }

    @After
    public void tearDown()
    {
        MockBukkit.unmock();
    }
}

POM:

<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>sv-plugins</groupId>
  <artifactId>CityCraft</artifactId>
  <version>1.0</version>
  <properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <profiles>
    <profile>
        <id>testing</id>
        <activation>
            <property>
                <name>test.output.dir</name>
            </property>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>2.3.1</version>
                    <configuration>
                      <outputDirectory>${test.output.dir}</outputDirectory>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
  </profiles>
  <repositories>
    <repository>
        <id>papermc</id>
        <url>https://papermc.io/repo/repository/maven-public/</url>
    </repository>
    <repository>
        <id>spigot-repo</id>
        <url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
    </repository>
    <repository>
        <id>everything</id>
        <url>https://repo.citizensnpcs.co/</url>
    </repository>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
    <repository>
        <id>aikar</id>
        <url>https://repo.aikar.co/content/groups/aikar/</url>
    </repository>
  </repositories>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.0</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
      <plugin>
      <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.3</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
                <configuration>
                    <artifactSet>
                        <includes>
                            <include>com.github.WesJD.AnvilGUI:anvilgui</include>
                            <include>co.aikar:acf-paper</include>
                        </includes>
                    </artifactSet>
                </configuration>
            </execution>
        </executions>
      </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
  </build>
  <dependencies>
  <dependency>
    <groupId>com.destroystokyo.paper</groupId>
    <artifactId>paper-api</artifactId>
    <version>1.15.2-R0.1-SNAPSHOT</version>
    <scope>provided</scope>
 </dependency>
  <dependency>
    <groupId>net.citizensnpcs</groupId>
    <artifactId>citizens</artifactId>
    <version>2.0.27-SNAPSHOT</version>
    <type>pom</type>
    <scope>provided</scope>
  </dependency>
  <dependency>
    <groupId>sv-plugins</groupId>
    <artifactId>MySQL</artifactId>
    <version>1.0</version>
    <scope>provided</scope>
  </dependency>
  <dependency>
    <groupId>sv-plugins</groupId>
    <artifactId>Clouds</artifactId>
    <version>1.0</version>
    <scope>provided</scope>
  </dependency>
  <dependency>
    <groupId>com.github.WesJD.AnvilGUI</groupId>
    <artifactId>anvilgui</artifactId>
    <version>master-SNAPSHOT</version>
  </dependency>
  <dependency>
    <groupId>co.aikar</groupId>
    <artifactId>acf-paper</artifactId>
    <version>0.5.0-SNAPSHOT</version>
  </dependency>
  <dependency>
    <groupId>com.github.seeseemelk</groupId>
    <artifactId>MockBukkit-v1.16</artifactId>
    <version>0.5.0</version>
    <scope>test</scope>
  </dependency>
  </dependencies>
</project>

好的,错误只是我不得不更改.class路径,因为我刚刚将默认的eclipse项目转换为Maven项目,所以我不得不删除Build Path中的默认src文件夹并添加不同的 Maven。没有它,Maven 会尝试将每个 class 作为正常编译,而不是作为使它们失败的测试。

如果有人感兴趣,这里是两个 .classpath 文件之间的比较:

旧:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
        <attributes>
            <attribute name="module" value="true"/>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry including="**/*.java" kind="src" output="target/classes" path="src">
        <attributes>
            <attribute name="optional" value="true"/>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="output" path="target/classes"/>
</classpath>

新:

<classpath>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
        <attributes>
            <attribute name="module" value="true"/>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="src" path="src/main/java"/>
    <classpathentry kind="src" output="target/test-classes" path="src/test/java">
        <attributes>
            <attribute name="test" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="src" path="src/main/resources"/>
    <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
        <attributes>
            <attribute name="maven.pomderived" value="true"/>
        </attributes>
    </classpathentry>
    <classpathentry kind="output" path="target/classes"/>
</classpath>