dubbo找不到或無法加載主類 org.apache.dubbo.container.Main

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章