Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将我的类打包到一个.jar中,并且仍然打包为war?_Java_Spring_Maven - Fatal编程技术网

Java 如何将我的类打包到一个.jar中,并且仍然打包为war?

Java 如何将我的类打包到一个.jar中,并且仍然打包为war?,java,spring,maven,Java,Spring,Maven,所以我有一个SpringMVCWeb应用程序,我使用maven在IntelliJ9中构建 当我运行时: mvn clean install 它将所有内容打包在.war文件和爆炸战争中 我的项目布局使用maven simple web app arch类型 How can I have my classes compiled into a .jar file also? 目前我的课程在: /target/myapp/WEB-INF/classes/ 我想让它在.jar中编译我的代码,比如:

所以我有一个SpringMVCWeb应用程序,我使用maven在IntelliJ9中构建

当我运行时:

mvn clean install
它将所有内容打包在.war文件和爆炸战争中

我的项目布局使用maven simple web app arch类型

How can I have my classes compiled into a .jar file also?
目前我的课程在:

/target/myapp/WEB-INF/classes/
我想让它在.jar中编译我的代码,比如:

myapp-1.0.jar
和我的所有其他JAR一样,我的
/target/myapp/WEB-INF/lib文件夹中也有这个

更新


我希望通过maven而不是intellij完成这项工作。您可以轻松创建两个工件-一个JAR和一个WAR


我不确定将.class文件放在JAR中与WEB-INF/classes相比有什么好处。两者都被压缩;JAR不会提供额外的压缩。您可能希望在其他应用程序中重新使用这些.class文件。如果是这样的话,你可以考虑把这些java类移到一个单独的模块中,并添加你创建的JAR文件,就像你在WAR文件中的任何其他第三方jar一样。其他应用程序可以很容易地从存储库中检出JAR文件,并简单地重用它。最好通过将共享Java类移动到版本控制系统中的单独存储库中来完成此安排。

打包类型由pom.xml中的“packaging”标记指定(通常与项目的工件id、版本等一起放在文件的顶部)

设法找到

<packaging>war</packaging>
战争
在pom.xml中,并将其更改为

<packaging>jar</packaging>
jar

确定在控制台中编写java命令


jar cvf myapp-1.0.jar*.class

我一点也不清楚将WAR的内容打包为jar有什么好处。如果没有WAR部署到的上下文,实现webapp的代码将无法工作


也就是说,将代码的功能核心提取到一个单独的Maven模块中,该模块具有JAR包装和一个漂亮的Java API,这是完全可行的。然后,您的WAR模块可以依赖于此,只需要精确地包含代码,就可以将Java API转换为基于web的API。这样做的好处是l还大大提高了代码的测试能力(针对JAR的测试肯定会更容易)并允许您考虑使用具有相同底层代码的其他客户端。这可能会引起您的兴趣,也可能不会引起您的兴趣。您是否需要直接在WAR中使用Java代码?可能会,可能不会。毕竟有几种方法可以做到这一点…

简单的解决方案是WAR插件的配置:

<attachClasses>true</attachClasses>
true
它将完成任务并创建一个单独的jar文件。这个jar有一个分类器“类”这可以通过提供到配置中来更改。如果您将依赖于war项目中classed的集成测试分离出来,将它们发布并作为依赖项提供,这将非常有用。这与职责分离无关。

running

mvn jar:jar install
将jar设置为您已将打包类型设置为jar,而不更改pom


因此,您只需单独运行该行,将其添加到脚本中,或者将
jar:jar
目标添加到现有的maven构建中。

我之所以这样做,是因为运行proguard显然需要它。我想使用maven来实现这一点,这样我就可以构建w/o intellij。正如duffymo所说,创建两个maven构件是一种方法:一个jar构件,contai我建议使用IntelliJ和抛弃Maven。当然,这只是我的偏好。我没有说创建两个Maven工件。我不使用Maven,也不建议使用Maven完全可以。有Maven或没有Maven都可以完成两个独立的工件。我更喜欢后者。从同一个Maven模块制作一个JAR和一个WAR是一个坏主意。不要这样做。考虑更清晰的职责分离。如果你真的想有一个单独的JAR并创建一个包含JAR的单独WAR文件(WEB-INF/lib)您必须将项目分开,一个是jar项目,另一个是war代码项目,war代码依赖于jar。那么,将项目的类放在WEB-INF/classes中而不是WEB-INF/lib中作为jar项目,有什么问题呢当你告诉工程师用新代码升级他们安装的webapp时,他们经常忘记更新类(因此保留配置)。将所有代码都放在lib目录中更容易。@Blankman我阅读了你关于混淆web应用程序的问题。你能提供你遵循的过程或一些配置文件吗?我能够生成混淆的jar和war(无需混淆).但我想用其中的obf.jar生成一个war。我有一个用例需要这种东西-我的web应用程序有一组属性文件,它们具有不同的暂存和生产设置配置(例如,不同的数据库模式名称)。每次我在登台上部署war时,我都必须手动去编辑这些文件,因为在我的存储库中提交的配置都是生产性的。如果我只有java代码更改(这对我来说是最常见的),那么只部署jar而不是部署整个war是有意义的(并且必须再次手动编辑)因为我不认为部署单个“.class”文件是个好主意。你听说过Maven吗?仔细阅读这个问题!