使用maven-assembly-plugin 打一个tar.gz包。然后允许Dubbo官方的start.sh发现报错如下:
找不到或无法加载主类 org.apache.dubbo.container.Main
我们来看下start.sh
nohup java $JAVA_OPTS $JAVA_MEM_OPTS $JAVA_DEBUG_OPTS $JAVA_JMX_OPTS -classpath $CONF_DIR:$LIB_JARS org.apache.dubbo.container.Main > $STDOUT_FILE 2>&1 &
这里使用的参数-classpath, 说明可能问题发生在依赖的所有的jar的路径上。
我把实际命令打印出来试试
java -classpath /Users/frank/all/tech/dubbo/dubbo-demo/dubbo-demo-provider/target/dubbo-demo-provider-2019-08-25T10:56:02Z/lib/dubbo-2.7.1.jar:/Users/frank/all/tech/dubbo/dubbo-demo/dubbo-demo-provider/target/dubbo-demo-provider-2019-08-25T10:56:02Z/lib/dubbo-demo-provider-1.0-SNAPSHOT.jar
而dubbo-demo-provider-2019-08-25T10:56:02Z/lib 这个文件夹本身包含了冒号,而java的classpath刚好也是使用冒号来隔开多个文件路径, 导致一个正确的路径被分割成了三个非法的路径
dubbo-demo-provider-2019-08-25T10
56
02Z/lib
明显 56 和02Z根本不是文件路径,问题出在这个以时间戳命名的路径上。
原因是
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<descriptors>
<descriptor>src/main/resources/assembly/assembly.xml</descriptor>
</descriptors>
<finalName>${project.build.finalName}-${maven.build.timestamp}</finalName>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
问题在${maven.build.timestamp}
生成了xxxx.tar.gz (命名带时间戳里的冒号)
需要去掉改成
<configuration>
<descriptors>
<descriptor>src/main/resources/assembly/assembly.xml</descriptor>
</descriptors>
<finalName>${project.build.finalName}</finalName>
</configuration>
这样就ok了。
答案揭晓
tar.gz文件命名千万不要含有冒号,否则解压后的文件夹也会含有冒号,这样,java -classpath执行的时候,会拼接上错误的路径,导致找不到正确的jar,导致找不到主类org.apache.dubbo.container.Main