noclassdeffounderror:maven模块间依赖

1mrurvl1  于 2021-06-24  发布在  Storm
关注(0)|答案(1)|浏览(315)

我的storm应用程序(maven)项目结构如下:

parent-project/
├── pom.xml
├── storm-application/
    └── pom.xml
├── utils/
    └── pom.xml

我构建了我的 pom.xml 文件如下: parent-project:pom.xml ```
4.0.0

<groupId>my.project</groupId>
<artifactId>parent-project</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>

<modules>
    <module>utils</module>
    <module>storm-application</module>
</modules>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

`storm-application:pom.xml`

my.project
parent-project
1.0-SNAPSHOT

my.project.parent-project
storm-application
jar

<dependencies>
    <dependency>
        <groupId>my.project.parent-project</groupId>
        <artifactId>utils</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

    <dependency> ...storm dependency... </dependency>
</dependencies>

<build>
    <sourceDirectory>src/main/java</sourceDirectory>
    <testSourceDirectory>src/test/java</testSourceDirectory>

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.1.1</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>

</build>

`utils:pom.xml`
4.0.0

<parent>
    <groupId>my.project</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>
<groupId>my.project.parent-project</groupId>
<artifactId>utils</artifactId>
<packaging>jar</packaging>

<dependencies>
    ... some project related dependencies ...
</dependencies>

<build>
    <sourceDirectory>src/main/java</sourceDirectory>
    <testSourceDirectory>src/test/java</testSourceDirectory>
</build>
我的目标是包含兄弟模块 `utils` 在 `storm-application` .
我需要包括模块 `utils` 直接在 `jar`  Package  `storm-application` 模块。
事实上,如果我直接从intellij运行main函数,它可以工作,因为它可以识别项目结构,但是如果我尝试使用storm部署应用程序,我会遇到以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: my/project/parent-project/utils/MyClass
at my.project.parent-project.storm-application.MainClass.main(MainClass.java:116)
Caused by: java.lang.ClassNotFoundException: my.project.parent-project.utils.MyClass
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more

我甚至试着用 `maven-assembly-plugin` 在包中包含所有依赖项,但我仍然得到相同的错误。
更新
所以我缺少的是程序集创建第二个 `jar` 在窗体上 `name-version-jar-with-dependencies` . 
另外,风暴的依赖性应该是 `<scope>provided</scope>` 否则它会抱怨。
不过,我想知道是否有更简单的方法来实现这种模块间的依赖性。
rdrgkggo

rdrgkggo1#

我找到了一个更干净的方法。我没有使用汇编插件,而是使用shade插件,这样fat jar就保留了标准名称。
最后,这是 storm-application/pom.xml 对我来说,这很管用:

<parent>
        <groupId>my.project</groupId>
        <artifactId>parent-project</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>my.project.parent-project</groupId>
    <artifactId>storm-application</artifactId>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>my.project.parent-project</groupId>
            <artifactId>utils</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency> ...storm dependency... </dependency>
    </dependencies>

    <build>
        <sourceDirectory>src/main/java</sourceDirectory>
        <testSourceDirectory>src/test/java</testSourceDirectory>

        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>

                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>

    </build>

相关问题