枚举不存在Maven软件包

时间:2018-09-26 05:43:46

标签: java maven

我的目标
 -我想将 API测试框架 X 代码(一个Maven项目)转换为jar,可以在另一个内部使用 API测试框架
 -此jar将部署到Nexus
 -我想在一个jar

中使用框架 X test&main

SO 中,我了解到您无法将它们组合成一个jar,因此必须将它们放在单独的Jar中。

我相应地修改了 POM

使用此命令时出现编译错误:

  

MVN全新安装-DskipTests

错误摘要:

[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /C:/main/projectX/src/main/java/com/myapp/core/EnumUserClass.java:[8,46] package com.myapp.testutils.ClassWithEnum does not exist
[ERROR] /C:/main/projectX/src/main/java/com/myapp/core/EnumUserClass.java:[226,6] cannot find symbol
  symbol:   class EnumUserClass
  location: class com.myapp.core.EnumUserClass...etc.

Maven编译器在查找类时没有问题,但是在找到此枚举时存在问题。

有人可以告诉我如何正确解决此错误吗?我是否以正确的方式实现了“我的目标”?

此问题中给出的example project(projectX)是我的actual project的简短版本。
maven命令对example project正常,但对actual project无效。

示例项目结构:(简体)

projectX:
    src/test/Java
        com.myapp.testutils
            class ClassWithEnum - This contains a public enum MyEnum
    src/test/resources
        text files here
    src/main/Java
        com.myapp.core
            class EnumUserClass - This is jackson annotated & uses MyEnum

示例项目pom.xml:(已缩短)

<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>com.myapp</groupId>
    <artifactId>my-jar</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <build>
        <defaultGoal>install</defaultGoal>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>test-jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <name>myjar</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!--Many dependencies here-->
    </dependencies>

    <distributionManagement>
        <site>
            <id>My-Nexus-Site</id>
            <url>https://host.com/path1</url>
        </site>
        <repository>
            <id>My-Nexus-Releases</id>
            <name>My-Nexus-Releases</name>
            <url>https://host.com/path2</url>
        </repository>
        <snapshotRepository>
            <id>My-Nexus-Snapshots</id>
            <name>My-Nexus-Snapshots</name>
            <url>https://host.com/path3</url>
        </snapshotRepository>
    </distributionManagement>
</project>

3 个答案:

答案 0 :(得分:2)

您可以从“ test / java”中的“ main / java”访问类,但不能反向进行。如果您查看日志,它正在main / java中寻找软件包。将包从“ test / java”移动到“ main / java”。那应该工作正常。

答案 1 :(得分:2)

您的问题实际上有3个问题(1个目标和2个问题)。但是,它们可以组合在一起并且可以固定在一起。

  1. 有人可以告诉我如何正确解决此错误吗?

这里的问题是Maven有自己的lifecycle

它具有 严格的结果

  • compile-编译项目的源代码
  • test-使用合适的单元测试框架测试已编译的源代码。这些测试不应要求将代码打包或部署

compile期间,您只能编译源代码。
但是,它取决于您的测试类(枚举),目前无法编译,因为它将仅在test阶段进行编译。
因此,编译失败

要解决此问题,请尝试将枚举类移至src/main/java。 它应该可以解决此编译错误。

  1. 我是否以正确的方式实现了“我的目标”?

要实现此目标,请在另一个jar中测试框架X的主要类 。 您可以将所有测试类和资源(不仅限于枚举类)移动到src/main/javasrc/main/resources

projectX:
    src/main/java
        com.myapp.core
            class EnumUserClass - This is jackson annotated & uses MyEnum
        com.myapp.testutils
            class ClassWithEnum - This contains a public enum MyEnum
    src/main/resources
        text files here

之后,您必须将所有pom范围更改为compile,并同时更新jar-plugin

最后,使用test & main classes构建一个jar文件。您可以从projectY

使用它

更多信息:How to create a jar containing test classes

答案 2 :(得分:0)

好的,我了解您要执行的操作,但是我认为这不是正确的方法。 您想使用这个项目(X)测试另一个项目(Y),对吗?然后,该项目(X)中的所有 main 类都用于测试项目(Y)。

但这是问题所在:似乎您正在尝试将测试类(在com.myapp.testutils文件夹中)放置在主文件夹中。这将导致错误:

  

[错误]   /C:/main/projectX/src/main/java/com/myapp/core/EnumUserClass.java:[8,46]   包com.myapp.testutils.ClassWithEnum不存在

(com.myapp.testutils)中的测试类用于测试项目X的主要代码。这些类用于检查项目X的主要代码是否正在执行应做的工作(在这种情况下- >以测试另一个项目)。

单元测试(com.myapp.testutils中的类)不应包装在jar中,但是可以确保应用程序正常运行。

How to write a Unit Test?

您的重点不应是将项目X的测试放入一个jar中,而是对项目X进行单元测试,然后将经过正确测试的项目X导入项目Y。

编辑: 如果com.myapp.testutils对于使项目X能够测试项目Y至关重要,请执行以下操作:将包从“ test / java”移动到“ main / java”。这样就可以了。