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>