Jersey JSON 应用程序构建失败
Jersey JSON application builds, fails
我有一个公开多个 REST 端点的 Java Web 应用程序。他们都工作。他们可以命中和 return 预期的数据(纯文本)。我需要他们 return JSON 来代替。为此,应用程序需要:
- 包含 "jersey-media-moxy" jar
- 在我们想要转换为 JSON
的任何 POJO 顶部包含 @XmlRootElement
我将 @XmlRootElement
添加到 class。我们的项目使用 gradle 构建。我将此行添加到 build.gradle 文件的 dependencies
部分的底部:
compile group: 'org.glassfish.jersey.media', name: 'jersey-media-moxy', version: '2.26'
它看起来与上面的线几乎相同:
compile group: 'org.glassfish.jersey.media', name: 'jersey-media-multipart', version: '2.22.2'
当然,名称和版本除外。它构建良好。我不得不将 jar (jersey-media-moxy-2.26.jar
) 添加到我们的依赖层次结构中,但这没什么大不了的。
它运行良好,直到用户登录。主屏幕上的许多组件丢失,并且出现错误(应用程序总是出现错误,但它们是预期的)。新错误多种多样,但重复出现的错误是:
SEVERE: StandardWrapper.Throwable
java.lang.NoClassDefFoundError: jersey/repackaged/com/google/common/base/Predicate
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:177)
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:369)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
...
堆栈跟踪从未将我们的任何源代码作为罪魁祸首。这都是 org.glassfish.jersey
和 org.apache.catalina.core
错误(我们使用 Tomcat 作为我们的服务器)。很明显,出了点问题。
我已经尝试了很多方法来解决这个问题,但我想不起来了,其中包括:
- 在我们拥有的 40 个左右依赖项的不同位置添加
jersey-media-moxy
(无差异)
- 显式添加所有
jersey-media-moxy
依赖项(即使没有它们也能正常构建;无差异)
- 删除
jersey-media-multipart
依赖项(构建失败)
- 废弃工作区并从源代码管理中重新 "get",并重新添加
jersey-media-moxy
依赖项(无差异)
- 正在将
jersey-media-multipart
升级到最新版本(不构建)
- 删除了
jersey-media-moxy
依赖项以查看我是否真的需要它(谁知道呢?也许 jersey-media-multipart
已经包含它)并将我正在 returning 的对象更改为非常简单 class(它只包含一个 string
)。 (失败,确实需要jersey-media-moxy
)
我是这里唯一的 Java 开发人员,这是我第一次使用 gradle 或 Jersey。我知道还有其他生成 JSON 的方法(例如使用 gson),但我们真的想让 Jersey 来做,因为我们已经在使用该框架了。
我们使用 Eclipse (Oxygen) 作为我们的 IDE 和 Tomcat 作为我们的服务器。
我的一个大问题是为什么新的 jar 会破坏现有的?
第二个问题当然是大问题:我该怎么做才能解决这个问题?
您的 2.26 和 2.22.2 差异可能是问题所在。不要混用 Jersey 模块版本。
why would a new jar break an existing one?
因为您要添加的不仅仅是一个 jar。当使用像 Maven 或 Gradle 这样的依赖管理系统时,你处理的是 dependencies 而不仅仅是 jars,还有你显式列表可以有自己的依赖项,这些依赖项会隐式地引入。例如,如果您只添加 jersey-media-moxy
,它会引入 10 多个额外的罐子。
这个问题是,如果你使用不兼容的版本,jersey-media-moxy
和 jersey-media-multipart
都会拉入一些相同的 jar,你不能有多个版本的 class。因此,只会使用这两个罐子中的 classes 之一。如您所知,软件会随着版本的变化而变化。因此,class 可能会尝试使用存在于一个版本中而不存在于另一个版本中的 class。如果您没有正确管理依赖项版本,这只是您可能面临的问题之一。
我有一个公开多个 REST 端点的 Java Web 应用程序。他们都工作。他们可以命中和 return 预期的数据(纯文本)。我需要他们 return JSON 来代替。为此,应用程序需要:
- 包含 "jersey-media-moxy" jar
- 在我们想要转换为 JSON 的任何 POJO 顶部包含
@XmlRootElement
我将 @XmlRootElement
添加到 class。我们的项目使用 gradle 构建。我将此行添加到 build.gradle 文件的 dependencies
部分的底部:
compile group: 'org.glassfish.jersey.media', name: 'jersey-media-moxy', version: '2.26'
它看起来与上面的线几乎相同:
compile group: 'org.glassfish.jersey.media', name: 'jersey-media-multipart', version: '2.22.2'
当然,名称和版本除外。它构建良好。我不得不将 jar (jersey-media-moxy-2.26.jar
) 添加到我们的依赖层次结构中,但这没什么大不了的。
它运行良好,直到用户登录。主屏幕上的许多组件丢失,并且出现错误(应用程序总是出现错误,但它们是预期的)。新错误多种多样,但重复出现的错误是:
SEVERE: StandardWrapper.Throwable
java.lang.NoClassDefFoundError: jersey/repackaged/com/google/common/base/Predicate
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:177)
at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:369)
at javax.servlet.GenericServlet.init(GenericServlet.java:158)
...
堆栈跟踪从未将我们的任何源代码作为罪魁祸首。这都是 org.glassfish.jersey
和 org.apache.catalina.core
错误(我们使用 Tomcat 作为我们的服务器)。很明显,出了点问题。
我已经尝试了很多方法来解决这个问题,但我想不起来了,其中包括:
- 在我们拥有的 40 个左右依赖项的不同位置添加
jersey-media-moxy
(无差异) - 显式添加所有
jersey-media-moxy
依赖项(即使没有它们也能正常构建;无差异) - 删除
jersey-media-multipart
依赖项(构建失败) - 废弃工作区并从源代码管理中重新 "get",并重新添加
jersey-media-moxy
依赖项(无差异) - 正在将
jersey-media-multipart
升级到最新版本(不构建) - 删除了
jersey-media-moxy
依赖项以查看我是否真的需要它(谁知道呢?也许jersey-media-multipart
已经包含它)并将我正在 returning 的对象更改为非常简单 class(它只包含一个string
)。 (失败,确实需要jersey-media-moxy
)
我是这里唯一的 Java 开发人员,这是我第一次使用 gradle 或 Jersey。我知道还有其他生成 JSON 的方法(例如使用 gson),但我们真的想让 Jersey 来做,因为我们已经在使用该框架了。
我们使用 Eclipse (Oxygen) 作为我们的 IDE 和 Tomcat 作为我们的服务器。
我的一个大问题是为什么新的 jar 会破坏现有的?
第二个问题当然是大问题:我该怎么做才能解决这个问题?
您的 2.26 和 2.22.2 差异可能是问题所在。不要混用 Jersey 模块版本。
why would a new jar break an existing one?
因为您要添加的不仅仅是一个 jar。当使用像 Maven 或 Gradle 这样的依赖管理系统时,你处理的是 dependencies 而不仅仅是 jars,还有你显式列表可以有自己的依赖项,这些依赖项会隐式地引入。例如,如果您只添加 jersey-media-moxy
,它会引入 10 多个额外的罐子。
这个问题是,如果你使用不兼容的版本,jersey-media-moxy
和 jersey-media-multipart
都会拉入一些相同的 jar,你不能有多个版本的 class。因此,只会使用这两个罐子中的 classes 之一。如您所知,软件会随着版本的变化而变化。因此,class 可能会尝试使用存在于一个版本中而不存在于另一个版本中的 class。如果您没有正确管理依赖项版本,这只是您可能面临的问题之一。