maven包依賴問題排除


  今天新引入一個包后,運行報如下錯誤:

Exception in thread "main" java.lang.NoClassDefFoundError: scala/Product$class

at akka.util.Timeout.<init>(Timeout.scala:13)

at akka.actor.ActorSystem$Settings.<init>(ActorSystem.scala:328)

at akka.actor.ActorSystemImpl.<init>(ActorSystem.scala:683)

at akka.actor.ActorSystem$.apply(ActorSystem.scala:245)

at akka.actor.ActorSystem$.apply(ActorSystem.scala:288)

at akka.actor.ActorSystem$.apply(ActorSystem.scala:263)

at akka.actor.ActorSystem$.create(ActorSystem.scala:191)

at org.apache.flink.runtime.akka.AkkaUtils$.createActorSystem(AkkaUtils.scala:106)

at org.apache.flink.runtime.akka.AkkaUtils.createActorSystem(AkkaUtils.scala)

at org.apache.flink.runtime.minicluster.MiniCluster.createRpcService(MiniCluster.java:747)

at org.apache.flink.runtime.minicluster.MiniCluster.start(MiniCluster.java:249)

at org.apache.flink.streaming.api.environment.LocalStreamEnvironment.execute(LocalStreamEnvironment.java:118)

at com.kuainiu.eventtrigger.CanalConsumer.main(CanalConsumer.java:39)

Caused by: java.lang.ClassNotFoundException: scala.Product$class

at java.net.URLClassLoader.findClass(URLClassLoader.java:381)

at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)

at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

... 13 more

  NoClassDefFoundError一看明顯是包依賴沖突,那么就只有查看包依賴關系,進入項目的pom文件目錄,執行mvn dependency:tree,如下截圖展示出依賴關系。

 

 
  如果圖中不好查看,可以通過命令mvn dependency:tree -Doutput=a.txt導出到a文件,在文件里面查看。
  針對maven的各種配置說明:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<!-- 模型版本。maven2.0必須是這樣寫,現在是maven2唯一支持的版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者組織的唯一標志,並且配置時生成的路徑也是由此生成, 如com.winner.trade,maven會將該項目打成的jar包放本地路徑:/com/winner/trade -->
<groupId>gstd</groupId>
<!-- 本項目的唯一ID,一個groupId下面可能多個項目,就是靠artifactId來區分的 -->
<artifactId>wocpWeb</artifactId>
<!-- 打包的機制,如pom,jar, maven-plugin, ejb, war, ear, rar, par,默認為jar -->
<packaging>war</packaging>
<!-- 本項目目前所處的版本號 -->
<version>0.0.1-SNAPSHOT</version>
<!--項目的名稱, Maven產生的文檔用 -->
<name>gstd-wocpWeb Maven Webapp</name>
<!--項目主頁的URL, Maven產生的文檔用 -->
<url>http://maven.apache.org</url>
<!--項目開發者屬性-->
<properties>
<!-- 文件拷貝時的編碼 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<org.springframework.version>3.0.5.RELEASE</org.springframework.version>
<org.eclipse.jetty.version>8.0.3.v20111011</org.eclipse.jetty.version>
<!-- Hibernate版本 -->
<org.hibernate.version>3.6.8.Final</org.hibernate.version>
</properties>
<!--發現依賴和擴展的遠程倉庫列表。-->
<!--發現依賴和擴展的遠程倉庫列表。-->
<repositories>
<!--包含需要連接到遠程倉庫的信息-->
<repository>
<!--遠程倉庫唯一標識符。可以用來匹配在settings.xml文件里配置的遠程倉庫-->
<id>public</id>
<!--遠程倉庫名稱-->
<name>Public Repositories</name>
<!--遠程倉庫URL,按protocol://hostname/path形式-->
<url>http://192.168.101.23:8081/nexus/content/groups/public/</url>
</repository>
</repositories>
<!--該元素描述了項目相關的所有依賴。 這些依賴組成了項目構建過程中的一個個環節。它們自動從項目定義的倉庫中下載。要獲取更多信息,請看項目依賴機制。-->
<dependencies>
<dependency>
<!--依賴的group ID-->
<groupId>javax.mail</groupId>
<!--依賴的artifact ID-->
<artifactId>mail</artifactId>
<!--依賴的版本號。 在Maven 2里, 也可以配置成版本號的范圍。-->
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jstl-impl</artifactId>
<version>1.2</version>
<!--排除以下依賴的包-->
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!--構建項目需要的信息-->
<build>
<!--產生的構件的文件名-->
<finalName>gstd-wocpWeb</finalName>
<!-- 通過過濾功能解析資源文件中的maven屬性 -->
<!--這個元素描述了項目相關的所有資源路徑列表,例如和項目相關的屬性文件,這些資源被包含在最終的打包文件里。-->
<resources>
<!--這個元素描述了項目相關或測試相關的所有資源路徑-->
<resource>
<!--描述存放資源的目錄,該路徑相對POM路徑-->
<directory>src/main/resources</directory>
<!--是否使用參數值代替參數名。參數值取自properties元素或者文件里配置的屬性,文件在filters元素里列出。-->
<filtering>true</filtering>
<!--包含哪些文件-->
<includes>
<include>application.yml</include>
<include>*.properties</include>
<include>*.xml</include>
<include>*.yml</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<filtering>false</filtering>
</resource>
</resources>
<!-- 編譯Java代碼插件 -->
<!--使用的插件列表 。-->
<plugins>
<!--plugin元素包含描述插件所需要的信息。-->
<plugin>
<!--插件在倉庫里的group ID-->
<groupId>org.apache.maven.plugins</groupId>
<!--插件在倉庫里的artifact ID-->
<artifactId>maven-compiler-plugin</artifactId>
<!--擴展配置項-->
<configuration>
<encoding>utf-8</encoding>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<!-- skip test -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>${org.eclipse.jetty.version}</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
<useFileMappedBuffer>false</useFileMappedBuffer>
<connectors>
<connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
<port>${wocp.server.start.startport}</port>
<maxIdleTime>60000</maxIdleTime>
</connector>
</connectors>
<stopKey>${wocp.server.start.stopkey}</stopKey>
<stopPort>${wocp.server.start.stopport}</stopPort>
<systemProperties>
<systemProperty>
<name>org.mortbay.jetty.Request.maxFormContentSize</name>
<value>1000000</value>
</systemProperty>
</systemProperties>
</configuration>
</plugin>
 
<!-- 利用assembly插件打包 -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/assembly/package.xml</descriptor>
</descriptors>
<!--在構建生命周期中執行一組目標的配置。每個目標可能有不同的配置。-->
<executions>
<!--execution元素包含了插件執行需要的信息-->
<execution>
<id>make-assembly</id>
<phase>package</phase>
<!--配置的執行目標-->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</configuration>
</plugin>
 
</plugins>
</build>
 
<!-- 針對不同環境的profile -->
<!--在列的項目構建profile,如果被激活,會修改構建處理-->
<profiles>
<!-- 開發配置 -->
<!--根據環境參數或命令行參數激活某個構建處理-->
<profile>
<id>dev</id>
<properties>
<wocp.server.start.startport>9200</wocp.server.start.startport>
<wocp.server.start.stopport>9201</wocp.server.start.stopport>
<wocp.server.start.stopkey>stop</wocp.server.start.stopkey>
<bill.db.driver>oracle.jdbc.OracleDriver</bill.db.driver>
<bill.db.url>jdbc:oracle:thin:@192.168.101.23:1521:nfc</bill.db.url>
<bill.db.username>bill_center</bill.db.username>
<bill.db.passwd>bill</bill.db.passwd>
<shine.db.driver>oracle.jdbc.OracleDriver</shine.db.driver>
<shine.db.url>jdbc:oracle:thin:@192.168.101.23:1521:nfc</shine.db.url>
<shine.db.username>shine_center</shine.db.username>
<shine.db.passwd>shine</shine.db.passwd>
</properties>
</profile>
<!-- 連接測試庫的配置 -->
<profile>
<id>test</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<wocp.server.start.startport>5180</wocp.server.start.startport>
<wocp.server.start.stopport>5181</wocp.server.start.stopport>
<wocp.server.start.stopkey>stop</wocp.server.start.stopkey>
<bill.db.driver>oracle.jdbc.OracleDriver</bill.db.driver>
<bill.db.url>jdbc:oracle:thin:@192.168.1.66:1521:orcl</bill.db.url>
<bill.db.username>dev_bill_smc</bill.db.username>
<bill.db.passwd>abc</bill.db.passwd>
<shine.db.driver>oracle.jdbc.OracleDriver</shine.db.driver>
<shine.db.url>jdbc:oracle:thin:@192.168.1.66:1521:orcl</shine.db.url>
<shine.db.username>dev_shine_smc</shine.db.username>
<shine.db.passwd>abc</shine.db.passwd>
</properties>
</profile>
<!-- 生產配置 -->
<profile>
<id>product</id>
<properties>
</properties>
</profile>
</profiles>
</project>
 

  關於包中的<scope>:
1.compile:默認值 他表示被依賴項目需要參與當前項目的編譯,還有后續的測試,運行周期也參與其中,是一個比較強的依賴。打包的時候通常需要包含進去
2.test:依賴項目僅僅參與測試相關的工作,包括測試代碼的編譯和執行,不會被打包,例如:junit
3.runtime:表示被依賴項目無需參與項目的編譯,不過后期的測試和運行周期需要其參與。與compile相比,跳過了編譯而已。例如JDBC驅動,適用運行和測試階段
4.provided:打包的時候可以不用包進去,別的設施會提供。事實上該依賴理論上可以參與編譯,測試,運行等周期。相當於compile,但是打包階段做了exclude操作
5.system:從參與度來說,和provided相同,不過被依賴項不會從maven倉庫下載,而是從本地文件系統拿。需要添加systemPath的屬性來定義路徑

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM