maven项目,多个依赖,打成一个可执行jar包,可根据profiles进行打包,出现的Could not find or load main class的解决方法。

时间:2022-01-12 09:11:44

maven项目,多个依赖,打成一个可执行jar包,可根据profiles进行打包,出现的Could not find or load main class的解决方法。 


本人的项目是一个设备端运行的项目,项目创建初期,使用的是简单的java项目,需要自己变异成可执行jar包运行。


后期,为了自动编译,将其改为maven项目。

因为需要将所要的maven依赖打进一个jar包,使用了maven-assembly-plugin的方式。
因为项目的源码的位置是src/com/ihangmei/dmc
因此,build中重新指定了源码路径。编译后,能够成功执行。
<build>
<!-- mvn打包的默认路径是src/main/java -->
        <!-- sourceDirectory 本项目在src下,打包出现:skip non existing resourceDirectory
            ../heartbeatProject/src/main/resources -->
            <sourceDirectory>src</sourceDirectory>
            。。。。
    </build>            

其中,finalName是编译后的jar的名称。

此时,build的完整配置如下:

    <build>
        <!-- mvn打包的默认路径是src/main/java -->
        <!-- sourceDirectory 本项目在src下,打包出现:skip non existing resourceDirectory
            ../heartbeatProject/src/main/java -->
                    <sourceDirectory>src</sourceDirectory>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.ihangmei.dmc.Heartbeat</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <!-- 将依赖包打到一个文件中 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.5.5</version>
                <configuration>
                    <finalName>1231</finalName>
                    <archive>
                        <manifest>
                            <mainClass>com.ihangmei.dmc.Heartbeat</mainClass>
                        </manifest>
                    </archive>
                    <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>
    
    ----
    
    再pom文件中增加了开发,测试,正式的profile配置信息,因为增加了properties文件,
    
    配置文件变为了
    <build>
        <!-- mvn打包的默认路径是src/main/java -->
        <!-- sourceDirectory 本项目在src下,打包出现:skip non existing resourceDirectory
            ../heartbeatProject/src/main/resources -->
        <resources>
            <resource>
                <directory>src</directory>
                <!-- 将pom中的profile的属性值放在properties文件中 -->
                <includes>
                    <include>**/*</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.ihangmei.dmc.Heartbeat</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <!-- 将依赖包打到一个文件中 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.5.5</version>
                <configuration>
                    <finalName>1231</finalName>
                    <archive>
                        <manifest>
                            <mainClass>com.ihangmei.dmc.Heartbeat</mainClass>
                        </manifest>
                    </archive>
                    <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>

    <profiles>
        <!-- 本地开发环境(Development) -->
        <profile>
            <id>Development</id>
            <!-- 打包时不指定profile id,默认激活本环境 -->
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <!-- 心跳服务器 URL, 最重要的配置, 域名是: hb.ihangmei.com -->
            </properties>
        </profile>
        <!-- 测试环境(TEST) 提供给测试团队的 -->
        <profile>
            <id>Test</id>
            <properties>
                <!-- 心跳服务器 URL, 最重要的配置, 域名是: hb.ihangmei.com -->
            </properties>
        </profile>
        <!-- 正式生产环境(Production) -->
        <profile>
            <id>Production</id>
            <properties>
                <!-- 心跳服务器 URL, 最重要的配置, 域名是: hb.ihangmei.com -->
            </properties>
        </profile>
    </profiles>
    
    此时,打包时,即使<directory>src</directory>指定了源码路径,
    编译完成后,使用java -jar XXX.jar 或者java -cp XXX.jar com.ihangmei.dmc.Heartbeat,
    解释是找不到main方法。
    
    经过检查发现,XXX.jar包中,保存的文件是.java,不是.class文件。
    
    因此,继续检查编译时的源码路径
    使用mvn clean compile -X,查看编译时的输出,
    发现,    No sources to compile
    ,继续追踪,发现compileSourceRoots = [D:\Users\zp\git\heartbeatProject\src\main\java]
    
    分析原因:
    将<resources>
            <resource>
                <directory>src</directory>
                <!-- 将pom中的profile的属性值放在properties文件中 -->
                <includes>
                    <include>**/*</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
        中的resource--directory
        与<sourceDirectory>src</sourceDirectory> 认为是相同的。
        其实是不同的。
        将pom文件中增加<sourceDirectory>src</sourceDirectory>,继续编译,mvn clean compile -X,通过,
        源码路径:[DEBUG]   (f) compileSourceRoots = [D:\Users\zp\git\heartbeatProject\src]
        
    
    正确的配置如下
    
    <build>
        <!-- mvn打包的默认路径是src/main/java -->
        <!-- sourceDirectory 本项目在src下,打包出现:skip non existing resourceDirectory
            ../heartbeatProject/src/main/resources -->
        <sourceDirectory>src</sourceDirectory>
        <resources>
            <resource>
                <directory>src</directory>
                <!-- 将pom中的profile的属性值放在properties文件中 -->
                <includes>
                    <include>**/*</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>dmc.ihangmei.com.Heartbeat</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
            <!-- 将依赖包打到一个文件中 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.5.5</version>
                <configuration>
                    <finalName>1231</finalName>
                    <archive>
                        <manifest>
                            <mainClass>dmc.ihangmei.com.Heartbeat</mainClass>
                        </manifest>
                    </archive>
                    <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>

    <profiles>
        <!-- 本地开发环境(Development) -->
        <profile>
            <id>Development</id>
            <!-- 打包时不指定profile id,默认激活本环境 -->
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <!-- 心跳服务器 URL, 最重要的配置, 域名是: hb.ihangmei.com -->
                <hbServer>http://139.217.21.195:16524</hbServer>
                <!-- 独立日志服务器 -->
                <privateLogServer>http://139.217.24.148:6620</privateLogServer>
                <!-- 使用域名的方式 UC正式服务器地址uc.amol.com.cn -->
                <UCServerAddress>uc.amol.com.cn</UCServerAddress>
                <!-- uc.amol.com.cn对应的IP -->
                <UCServerAddressIP>139.217.19.34</UCServerAddressIP>
                <!-- 分钟数,到时间就自杀,保证内存泄露(如果有)不会影响系统 -->
                <liveTime>30</liveTime>
                <!-- 秒数,最短心跳间隔 -->
                <minInterval>60</minInterval>
                <!-- 秒数,设备访问GEOService的间隔 -->
                <geoInterval>320</geoInterval>
                <!-- 日志上传服务器 -->
                <uploadURL>http://app.iwangfan.cn:8997/datapro-receive/transfer.do</uploadURL>
                <!-- 要压缩的文件大小,要大于200KB -->
                <tarSize>204800</tarSize>
                <!-- 上传日志的时间间隔 ,单位毫秒,30分钟 -->
                <uploadInterval>1800000</uploadInterval>
                <!-- 检查需要上传日志的时间间隔 ,单位毫秒,1分钟 -->
                <checkInterval>60000</checkInterval>
                <!-- 打点日志保存时间的间隔 ,单位毫秒,10秒 -->
                <hitlogSaveInterval>10000</hitlogSaveInterval>
            </properties>
        </profile>
        <!-- 测试环境(TEST) 提供给测试团队的 -->
        <profile>
            <id>Test</id>
            <properties>
                <!-- 心跳服务器 URL, 最重要的配置, 域名是: hb.ihangmei.com -->
                <hbServer>http://139.217.26.111:8081/heartbeat/</hbServer>
                <!-- 独立日志服务器 -->
                <privateLogServer>http://139.217.24.148:6620</privateLogServer>
                <!-- 使用域名的方式 UC正式服务器地址uc.amol.com.cn -->
                <UCServerAddress>uc.test.amol.com.cn</UCServerAddress>
                <!-- uc.amol.com.cn对应的IP -->
                <UCServerAddressIP>139.217.26.25</UCServerAddressIP>
                <!-- 分钟数,到时间就自杀,保证内存泄露(如果有)不会影响系统 -->
                <liveTime>30</liveTime>
                <!-- 秒数,最短心跳间隔 -->
                <minInterval>60</minInterval>
                <!-- 秒数,设备访问GEOService的间隔 -->
                <geoInterval>320</geoInterval>
                <!-- 日志上传服务器 -->
                <uploadURL>http://dmc-tst-wifibox.chinacloudapp.cn:8080/datapro-receive/transfer.do</uploadURL>
                <!-- 要压缩的文件大小,要大于512Byte -->
                <tarSize>512</tarSize>
                <!-- 上传日志的时间间隔 ,单位毫秒,10秒 -->
                <uploadInterval>10000</uploadInterval>
                <!-- 检查需要上传日志的时间间隔 ,单位毫秒,10秒 -->
                <checkInterval>10000</checkInterval>
                <!-- 打点日志保存时间的间隔 ,单位毫秒,10秒 -->
                <hitlogSaveInterval>10000</hitlogSaveInterval>
            </properties>
        </profile>
        <!-- 正式生产环境(Production) -->
        <profile>
            <id>Production</id>
            <properties>
                <!-- 心跳服务器 URL, 最重要的配置, 域名是: hb.ihangmei.com -->
                <hbServer>http://139.217.21.195:16524</hbServer>
                <!-- 独立日志服务器 -->
                <privateLogServer>http://139.217.24.148:6620</privateLogServer>
                <!-- 使用域名的方式 UC正式服务器地址uc.amol.com.cn -->
                <UCServerAddress>uc.amol.com.cn</UCServerAddress>
                <!-- uc.amol.com.cn对应的IP -->
                <UCServerAddressIP>139.217.19.34</UCServerAddressIP>
                <!-- 分钟数,到时间就自杀,保证内存泄露(如果有)不会影响系统 -->
                <liveTime>30</liveTime>
                <!-- 秒数,最短心跳间隔 -->
                <minInterval>60</minInterval>
                <!-- 秒数,设备访问GEOService的间隔 -->
                <geoInterval>320</geoInterval>
                <!-- 日志上传服务器 -->
                <uploadURL>http://app.iwangfan.cn:8997/datapro-receive/transfer.do</uploadURL>
                <!-- 要压缩的文件大小,要大于200KB -->
                <tarSize>204800</tarSize>
                <!-- 上传日志的时间间隔 ,单位毫秒,30分钟 -->
                <uploadInterval>1800000</uploadInterval>
                <!-- 检查需要上传日志的时间间隔 ,单位毫秒,1分钟 -->
                <checkInterval>60000</checkInterval>
                <!-- 打点日志保存时间的间隔 ,单位毫秒,10秒 -->
                <hitlogSaveInterval>10000</hitlogSaveInterval>
            </properties>
        </profile>
    </profiles>