使用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