java.lang.NoClassDefFoundError: Failed to link org/pentaho/di/core/attributes/metastore/EmbeddedMetaStore

java.lang.NoClassDefFoundError: Failed to link org/pentaho/di/core/attributes/metastore/EmbeddedMetaStore

我正在使用 Pentaho Kettle 构建一个批处理来处理一些文件。该批处理由一个 servlet 启动。但是,当我尝试启动它时,我收到以下实际上阻止进程的警告:

WARN  [org.jboss.modules] (Batch Thread - 2) Failed to define class org.pentaho.di.core.attributes.metastore.EmbeddedMetaStore in Module "deployment.my-program-1.0.0.0-SNAPSHOT.war:main" from Service Module Loader: java.lang.NoClassDefFoundError: Failed to link org/pentaho/di/core/attributes/metastore/EmbeddedMetaStore (Module "deployment.my-program-1.0.0.0-SNAPSHOT.war:main" from Service Module Loader): org/pentaho/metastore/api/BaseMetaStore
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:446)
at org.jboss.modules.ModuleClassLoader.loadClassLocal(ModuleClassLoader.java:274)
at org.jboss.modules.ModuleClassLoader.loadClassLocal(ModuleClassLoader.java:78)
at org.jboss.modules.Module.loadModuleClass(Module.java:605)
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:363)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:351)
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:93)
at org.pentaho.di.base.AbstractMeta.<init>(AbstractMeta.java:162)
at org.pentaho.di.job.JobMeta.<init>(JobMeta.java:201)
at org.pentaho.di.job.JobMeta.<init>(JobMeta.java:755)

但是,当我查看我的 lib 文件夹时,包含此 class (kettle-engine-8.2.0.0-342.jar) 的 jar 是那里 class 也在里面。

我在计算机上使用 JBoss EAP 7.0 和 Java 1.8.0.161 进行开发。我从我的 IDE (Eclipse Photon) 开始。这是我在 pom.xml:

中的依赖项
<dependencies>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
    </dependency>
    <!-- vf2 debug -->
    <dependency>
         <groupId>org.apache.commons</groupId>
        <artifactId>commons-vfs2</artifactId>
        <version>2.2</version>
    </dependency>

    <!-- maven-war-plugin-->
    <dependency>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.2</version>
    </dependency>

    <!-- pentaho kettle -->
    <dependency>
        <groupId>pentaho-kettle</groupId>
        <artifactId>kettle-core</artifactId>
        <version>8.2.0.0-342</version>
    </dependency>
    <dependency>
        <groupId>pentaho-kettle</groupId>
        <artifactId>kettle-engine</artifactId>
        <version>8.2.0.0-342</version>
    </dependency>

    <dependency>
        <groupId>com.googlecode.json-simple</groupId>
        <artifactId>json-simple</artifactId>
        <version>1.1</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.janino</groupId>
        <artifactId>janino</artifactId>
        <version>2.5.16</version>
    </dependency>       
    <dependency>
        <groupId>org.mozilla</groupId>
        <artifactId>rhino</artifactId>
        <version>1.7R3</version>
    </dependency>
    <!-- this correct an error -->
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.6</version>
    </dependency>

    <!-- netty version override to correct netty 3.7 bug / FYI, pentaho don't use netty anyway-->
    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty</artifactId>
        <version>3.9.0.Final</version>
    </dependency>
</dependencies>

重要提示:使用以前版本的 kettle-core 和 kettle-engine(使用 7.0 测试)时不会出现此问题。 这是一个嵌入式调用,所以我不会在我的代码中直接调用它 class。

我的 class 路径中没有此 jar 的多个版本。

我公司的另一个人发现了,所以我就在这里回答以结束话题。 我没有在这里展示它,但在我的依赖项中,我依赖于工作中的一些自定义框架。这个框架其实包含了pentaho,不过是7.0版本。然后,@suresh 在谈论多版本 jar 时是对的。

所以答案是:

检查是否有任何依赖项实际上包含您在其他地方调用的重复依赖项。为避免此问题,请在调用错误版本的依赖项中使用排除语法:

        <exclusions>
            <exclusion>
                <groupId>pentaho-kettle</groupId>
                <artifactId>kettle-engine</artifactId>
            </exclusion>
            <exclusion>
                <groupId>pentaho-kettle</groupId>
                <artifactId>kettle-core</artifactId>
            </exclusion>
        </exclusions>