我有战争依赖:
<dependency>
<groupId>my.package</groupId>
<artifactId>myservices</artifactId>
<version>0.3</version>
<type>war</type>
</dependency>
现在,它存在于我的本地存储库中,该类存在于WEB-INF/classes/my/package/myservices
。但是,当我使用myservices
时,我得到的包my.package
不存在。 Intelli-J知道将myservices
更改为my.package.myservices
,但尝试import
似乎根本不起作用。
对于这种战争依赖,我需要做些什么特别的事吗?
答案 0 :(得分:32)
它只是不起作用。 war文件不应该放在类路径上,而是部署到可以处理其特殊结构的应用程序服务器(或servlet容器)。
当然你可以找到一个可以处理java war文件的自定义类加载器,但它不是这样做的。
将您的代码保存在jar中,在战争中和此应用程序中包含jar。但是,除非要构建EAR文件,否则不要将war用作依赖项。
答案 1 :(得分:26)
正如其他答案所指出:
但是,如果由于某种原因你不能/不想拆分WAR项目,你也可以告诉Maven除了WAR之外你还需要一个JAR工件。把它放到WAR项目的POM中:
<build>
...
<plugins>
...
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<attachClasses>true</attachClasses>
</configuration>
</plugin>
</plugins>
</build>
然后,在构建WAR项目时,Maven将从中创建一个WAR 和一个JAR。
改编自doc_180的评论,因此不会被忽视。
答案 2 :(得分:3)
Maven根据JAR依赖关系处理WAR依赖关系的方式非常不同。它们被视为叠加。
http://maven.apache.org/plugins/maven-war-plugin/overlays.html
我认为你所寻找的东西与WAR叠加有点不同。 WAR叠加层将文件结构与“最接近的胜利”模型合并,但这意味着像web.xml这样的东西被最接近的胜利所取代,而不是合并。
如果你想要合并(这与大多数人在开始讨论WAR依赖关系时的想法更接近),你应该看一下Cargo uberwar插件。
http://cargo.codehaus.org/Merging+WAR+files
如果您的目标只是在两个WAR之间共享一些类,那么您应该将这些类放入JAR项目中。 Maven特别适合在pom.xml上工作 - &gt;单个工件模型(JAR / WAR / etc)。尝试使用单个pom.xml并让它为某些东西发出一个JAR,并为其他东西发出一个WAR会非常痛苦。
顺便说一句,如果您正在为一个超过一个人的团队工作,那么您将非常想要一个工件管理服务器(例如Artifactory,Nexus或Archiva),否则您将会疯狂地处理这些事情。 ;)
答案 3 :(得分:2)
在WAR中,类必须位于WEB-INF/classes/...
而不是classes/...
。
无论如何,我从来没有尝试从WAR(而不是JAR)引用其他类,我不知道这是否可行。
答案 4 :(得分:0)
确保依赖项已安装在本地存储库中 本地回购应该如下:
.m2/my/package/myservices/0.3/myservices-0.3.war
如果不是这种情况,则在将依赖于以下内容之前将war安装到本地存储库中:
mvn install:install-file -Dfile="[path-to-war]" -DgroupId=my.package -DartifactId=myservices -Dversion=0.3 -Dpackaging=war -DcreateChecksum=true -DgeneratePom=true