第三方API无法在多模块Maven项目

时间:2017-10-30 16:08:31

标签: java json maven

我有一个多模块maven项目,在dao模块中,我添加了JSON-IO依赖项。当我尝试反序列化我的对象时,它给了我:

Exception in thread "main" com.cedarsoftware.util.io.JsonIoException: Class listed in @type [hu.kleatech.projekt.model.Employee] is not found

类名是正确的,Employee是公共的,dao将模块作为依赖项。什么可能出错?

编辑:由于这是一个老问题并且很久以前就得到了回答,我删除了我专门针对这个问题制作的github存储库。问题的解决方案在接受的答案中,确切的代码是不相关的。

3 个答案:

答案 0 :(得分:1)

请尝试向Employee类添加一个空构造函数。

编辑:实际上,虽然添加一个空构造函数可以解决问题,但并不是必需的。 Json-IO"将勇敢地努力实例化Class中传递的内容,包括调用其所有构造函数直到成功。他们尝试的命令是公开的,最少的参数首先是私有的,参数最多。"

(从MetaUtils.java javadoc复制)

此外,在调用多参数构造函数时,库会使用null和基元的默认值填充参数。然后忽略构造函数调用期间抛出的任何异常。在您的情况下,抛出了NullPointerException,因为构造函数不是null安全的。因此,要么修改构造函数以便它可以处理空值,要么添加一个空构造函数。

答案 1 :(得分:0)

根据您的项目和模块Pom,您的主Pom应按以下顺序安装模块....

    <modules>
        <module>core</module>
        <module>controller</module>
        <module>service</module>
        <module>dao</module>
    </modules>
  • 服务取决于核心,因此核心应该在服务之前构建
  • dao取决于服务和核心,所以dao应该在核心和服务之后。

员工类在核心中可用,它应该在核心jar中可用。

您应该在主Pom中添加depencyManagent,然后在dependencyManagement中添加所有模块作为依赖项,这样无论谁将主Pom添加为依赖项,都可以访问所有的jar。

更改订单后,再次构建项目,然后更新您的maven项目。

如果此代码正在另一个项目中使用,那么请确保您已将jar上传到存储库(mvn deploy),以便使用它的任何人都可以在构建项目时下载它。

验证是否在使用或未使用该主项目的情况下下载此jar的一种方法是检查项目资源管理器中是否存在Maven依赖项部分,您可以在其中查看所有依赖项jar并检查核心是否存在。

我不确定主Pom中的控制器模块是做什么的,因为我在项目中找不到该名称的模块,因此您应该删除它或为其添加模块(文件夹)。

答案 2 :(得分:0)

Maven依赖关系配置是<parent>元素的分层结构,而不是<modules>元素。

这意味着在项目的pom.xml文件中,您依赖于&#34; JSON-IO依赖&#34;您没有依赖于dao项目或该类所在的位置。

<modules>仅代表定义要构建的项目。模块顺序定义无关紧要,因为Maven按所需的依赖关系检测顺序

因此,您可以在

中的<parent> pom.xml中定义依赖关系
  • <dependencies>元素。然后所有的孩子都会拥有它。

  • <dependencyManagement> - 然后需要它的孩子可以将其包含在<dependencies>中,而不需要常见的配置,例如版本,范围等......

在这里看一下非常相似的答案: How to minimize maven pom.xml