Java 使用maven和eclipse将公共类打包到WAR中

Java 使用maven和eclipse将公共类打包到WAR中,java,java-ee-6,maven-3,Java,Java Ee 6,Maven 3,我有两个基于maven的eclipse项目,一个是带有公共类的项目,另一个是使用这些类的JavaEEWeb应用程序 现在,我知道了将公共项目构建为jar并将其作为依赖项添加到另一个jar的方法 但是,如果我希望普通类直接包含在WAR的WEB-INF/类中,我该如何解决这个问题呢 而且,该机制在eclipse中和从运行maven命令的命令行中都能工作吗?您可以使用将包含公共类的.jar工件解包到目标文件夹。您还需要使原始依赖项具有提供的作用域,这样类就不会同时包含在类文件夹和(作为.jar)生成的

我有两个基于maven的eclipse项目,一个是带有公共类的项目,另一个是使用这些类的JavaEEWeb应用程序

现在,我知道了将公共项目构建为jar并将其作为依赖项添加到另一个jar的方法

但是,如果我希望普通类直接包含在WAR的WEB-INF/类中,我该如何解决这个问题呢


而且,该机制在eclipse中和从运行maven命令的命令行中都能工作吗?

您可以使用将包含公共类的.jar工件解包到目标文件夹。您还需要使原始依赖项具有提供的
作用域
,这样类就不会同时包含在
文件夹和(作为.jar)生成的war中的
libs
文件夹中

正确的方法是有两个Maven项目。通过将库中的包声明为“jar”,将webapp声明为“war”,maven将使用正确的插件来构建您所描述的应用程序。您的场景是相当常见的,除了我将要给您提供的信息之外,Maven文档中还有很多关于这方面的信息

您的库jar应该使用类似以下内容的pom构建:

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.myproject.mypackage</groupId>
    <artifactId>my-lib</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>${project.artifactId}</name>
    <packaging>jar</packaging>
<?xml version="1.0" encoding="UTF-8"?>
<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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.myproject.mypackage</groupId>
    <artifactId>my-war</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>${project.artifactId}</name>

    <dependencies>
        <dependency>
            <groupId>com.myproject.mypackage</groupId>
            <artifactId>my-lib</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>

4.0.0
com.myproject.mypackage
我的自由
1.0.0-SNAPSHOT
${project.artifactId}
罐子
您的Web应用程序应使用类似于以下内容的pom构建:

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.myproject.mypackage</groupId>
    <artifactId>my-lib</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>${project.artifactId}</name>
    <packaging>jar</packaging>
<?xml version="1.0" encoding="UTF-8"?>
<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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.myproject.mypackage</groupId>
    <artifactId>my-war</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>${project.artifactId}</name>

    <dependencies>
        <dependency>
            <groupId>com.myproject.mypackage</groupId>
            <artifactId>my-lib</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>

4.0.0
com.myproject.mypackage
我的战争
1.0.0-SNAPSHOT
战争
${project.artifactId}
com.myproject.mypackage
我的自由
1.0.0-SNAPSHOT
编译
当您构建webapp时,maven将自动将您的库Jar包含在您的webinf/lib目录中。永远不要手动将文件放在这个目录中,让Maven为您完成繁重的工作

编辑:问题是如何在构建过程中解压jar,这是一个非常糟糕的想法,有很多原因和不好的实践。持久性类属于EJB,而不是WEB-INF/类。这样做还将使您脱离标准JavaEE支持。。。然而,答案是:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.4</version>
    <executions>
        <execution>
            <id>unpack</id>
            <phase>package</phase>
            <goals>
                <goal>unpack-dependencies</goal>
            </goals>
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>com.myproject.mypackage</groupId>
                        <artifactId>my-lib</artifactId>
                        <version>1.0.0-SNAPSHOT</version>
                        <overWrite>true</overWrite>
                        <outputDirectory>WEB-INF/classes</outputDirectory>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>

org.apache.maven.plugins
maven依赖插件
2.4
打开
包裹
解包依赖项
com.myproject.mypackage
我的自由
1.0.0-SNAPSHOT
真的
WEB-INF/课程

谢谢你的提示。但由于我对maven完全陌生,我不确定如何正确使用它。我修改了您指出的示例,但它没有将其打包到eclipse中已部署的war中。此外,它还抱怨没有在m2e中支持解包。感谢您重新提出旧问题,它仍然可以使用。但我的问题中有一个细节您可能忽略了:我的意图不是在WEB-INF/lib中添加jar文件,而是直接在WEB-INF/classes下添加来自公共项目的编译类,就像它们是第二个项目的源代码树的一部分一样。原因是,当放置在common.jar中时,common的持久性配置无法识别。如果这是一个JEE项目,您的持久性类应该放在EJB中,而不是WEB-INF/类中,它们将被自动识别。我强烈建议坚持最佳实践并遵循这一模式。如果你真的想打开一个jar,并且愿意接受你将来将面临的众多问题,你可以使用maven依赖插件来完成这一点。你对最佳实践的看法是正确的,我的意图是不违反它们。也许我做错了什么。我有我的标准实体pojo,并将它们放在一个common.jar中。我还将persistence.xml放入其中。但是,当在战争中使用这个罐子时,容器无法使用实体并对此表示不满。这就是为什么我试图把这些课程直接投入战争。所以,如果你能给我指出一个以这种方式布局的示例项目,我将不胜感激。如果你想在你的应用程序中直接使用实体类,你可以使用Spring来实例化一个持久性容器。这会让你的应用程序膨胀,Spring也有自己的学习曲线。如果您使用的是Eclipse,请创建一个新的EJB项目。将JPA2.0方面添加到项目中。在Eclipse中从数据库连接生成持久性类。我整天都在工作,但我没有“公共领域”的例子,只有教程…好的,我会尝试你的建议,但由于其他主题,目前无法这样做,尽管我接受这是一个解决方案。无论如何,我会很感激有一个链接指向这个方向的好教程!如果您发现任何答案有用,或者证明您的问题无法解决,请务必接受并回答并投票支持:-)