Java Can';不能使用运行时依赖项编译,但可以使用compile

Java Can';不能使用运行时依赖项编译,但可以使用compile,java,maven,okta,Java,Maven,Okta,我有一个多模块项目,在一个模块中,我试图添加自述文件中描述的依赖项: 1.5.4 com.okta.sdk okta sdk api ${okta.version} com.okta.sdk okta sdk impl ${okta.version} 运行时 com.okta.sdk okta sdk httpclient ${okta.version} 运行时 但是它没有使用mvn clean package-pl my module编译,它失败并出现错误: [ERROR] COMPILA

我有一个多模块项目,在一个模块中,我试图添加自述文件中描述的依赖项:


1.5.4
com.okta.sdk
okta sdk api
${okta.version}
com.okta.sdk
okta sdk impl
${okta.version}
运行时
com.okta.sdk
okta sdk httpclient
${okta.version}
运行时
但是它没有使用
mvn clean package-pl my module
编译,它失败并出现错误:

[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /some/path/OktaUsers.java:[9,38] error: package com.okta.sdk.impl.resource.user does not exist
[ERROR] /some/path/OktaUsers.java:[96,14] error: cannot find symbol
[ERROR]  class OktaUsers
/some/path/OktaUsers.java:[97,13] error: cannot find symbol
[INFO] 3 errors 
此类
OktaUsers
引用了Okta SDK类。但是如果我将
运行时
范围更改为
编译
,用于
okta sdk impl
工件:


com.okta.sdk
okta sdk impl
${okta.version}
编译
然后编译完成得很好:
mvn clean package-pl my module

[INFO] BUILD SUCCESS
但由于依赖性问题,最终应用程序无法按预期工作:

java.lang.NoClassDefFoundError: Could not initialize class com.okta.sdk.impl.ds.DefaultDataStore
    at com.okta.sdk.impl.client.AbstractClient.createDataStore(AbstractClient.java:73)
    at com.okta.sdk.impl.client.AbstractClient.<init>(AbstractClient.java:68)
    at com.okta.sdk.impl.client.DefaultClient.<init>(DefaultClient.java:99)
    at com.okta.sdk.impl.client.DefaultClientBuilder.build(DefaultClientBuilder.java:305)
我在这里使用
impl
依赖项中的类,因为
api
dep没有管理Okta角色的方法


当运行
mvn verify-pl my module


Maven版本:

Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-04T22:00:29+03:00)
Maven home: /usr/share/maven-bin-3.6
Java version: 1.8.0_212, vendor: IcedTea, runtime: /opt/icedtea-bin-3.12.0/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "4.19.44-gentoo", arch: "amd64", family: "unix"

你能发布
/some/path/OktaUsers.java
的内容吗?看起来这个类依赖于Okta IMPL包中的类。如果我正确理解Okta API,那么您自己的代码应该只依赖/使用API模块中的类,而不是impl模块中的类。如果您从impl模块中删除对类的依赖,您应该可以

编辑1: 我看到两种方法。您可以删除对DefaultRole的依赖关系

// line 95:
private Role adminRole() {
    Role role = this.okta.instantiate(Role.class);
    role.setType("USER_ADMIN");
    // use reflection to check if there is a setProperty() method
    // and call it if it's really necessary
    // role.setProperty("status", RoleStatus.ACTIVE);
    return role;
}
第二种方法是找出jvm无法实例化
com.okta.sdk.impl.ds.DefaultDataStore
的原因。这可能是一项非常乏味的任务,因为jvm没有向您提供正确的错误消息。我猜类路径中缺少依赖项。您需要查看类的源代码,并确保所有引用的类(以及这些类引用的所有类等等)都在类路径上。这样做时,您需要确保使用这些类的正确版本,即引用类构建所依据的版本。对于初学者,请确保类路径上有
org.slf4j.Logger
和记录器的单个实现,并且配置正确


正确的修复方法是更改api。okta问题列表中似乎有一个已解决的问题,描述了一个类似的问题。也许这能帮到你?如果没有,我建议联系okta开发人员,询问他们如何解决您的问题。

范围为
运行时的依赖项仅在运行时可用,而不是在编译时可用。这是针对不应直接调用的实现jar和框架jar的


范围为编译的依赖项在编译时和运行时都可用。

SDK的哪个版本?看起来您缺少匹配的okta sdk版本。确保它们都在同一个版本上,您应该准备好了@KunalVohra我有一个属性
okta.version
pom.xml
中的version来设置所有版本,版本是
1.5.4
你能分享你的项目的更广泛的细节吗,比如它的springboot,maven等等。我最近没有集成,但没有遵循你提到的方法。它很容易实现。也许其他方法对你有用。@KunalVohra我在问题中添加了Maven版本的详细信息,根本没有spring依赖项。你是对的,我使用的是
impl
dependency中的一些类(用一些源代码更新了问题)。但是当使用
mvnverify-plmymodule