在java EE中,我应该将哪些jar放在库目录中?

2023-11-26

我有一个 Java EE 项目。该项目使用 Maven 构建为 .ear 存档。有一个包含JPA 2持久单元的库jar,它位于ear的库目录中(因此多个其他模块可以使用它)。

在将 Shiro 的 Permission 接口的实现添加为该持久性单元中的实体时,我在正确部署 Ear 时遇到了困难,因为 Shiro 类在持久性单元中不可用。我最终发现我需要将库 jar 的所有依赖项(也适用于传递依赖项)放入库目录中才能部署它。

所以最终的布局大致如下:

ear
`- lib
   `- persistence-unit.jar
    - shiro-core.jar
    - slf4j-api.jar
 - module1
 - moduleN
 - library1.jar
 - libraryN.jar

现在,对于问题:

  1. 对于应该放在库目录中的内容是否有任何指南,我的解决方案通常可以接受吗?
  2. 为什么 lib 目录中的 jar 无法使用 Ear 根目录中的库?
  3. 为什么 Maven 不自动解决这个问题?

编辑:耳朵的 pom.xml

<?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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ear</artifactId>
    <packaging>ear</packaging>

    <parent>
        <groupId>com.example</groupId>
        <artifactId>project</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-ear-plugin</artifactId>
                <version>2.7</version>
                <configuration>
                    <modules>
                        <webModule>
                            <!-- ... -->
                        </webModule>
                        <ejbModule>
                            <!-- ... -->
                        </ejbModule>
                        <jarModule>
                            <groupId>com.example</groupId>
                            <artifactId>persistence-unit</artifactId>
                            <bundleDir>lib</bundleDir>
                        </jarModule>

                        <-- I added these to get the deployment working -->
                        <jarModule>
                            <groupId>org.apache.shiro</groupId>
                            <artifactId>shiro-core</artifactId>
                            <bundleDir>lib</bundleDir>
                        </jarModule>
                        <jarModule>
                            <groupId>org.slf4j</groupId>
                            <artifactId>slf4j-api</artifactId>
                            <bundleDir>lib</bundleDir>
                        </jarModule>
                    </modules>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>persistence-unit</artifactId>
        </dependency>
        <dependency>
            <!-- ... -->
            <type>war</type>
        </dependency>
        <dependency>
            <!-- ... -->
            <type>ejb</type>
        </dependency>

        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
        </dependency>
    </dependencies>
</project>

对于持久性单元:

<?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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <artifactId>persistence-unit</artifactId>
    <packaging>jar</packaging>

    <parent>
        <groupId>com.example</groupId>
        <artifactId>project</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.jboss.spec</groupId>
            <artifactId>jboss-javaee-6.0</artifactId>
            <type>pom</type>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-core</artifactId>
        </dependency>
    </dependencies>
</project>

对于应该放在库目录中的内容是否有任何指南,我的解决方案通常可以接受吗?

您已经基本搞定了,所有 EAR 模块都可用的 JAR 应该放在此处。

为什么 lib 目录中的 jar 无法使用 Ear 根目录中的库?

它通常以相反的方式工作,JAR 位于lib文件夹可供根目录中的文件夹使用。但是,我相信您可以通过使用来实现这一目标<includeInApplicationXml>:

<jarModule>
    <groupId>org.nisse</groupId>
    <artifactId>hue</artifactId>
    <includeInApplicationXml>true</includeInApplicationXml>
</jarModule>

为什么 Maven 不自动解决这个问题?

我假设你的意思是maven不会自动将所有传递依赖项放入lib?我相信它应该可以,并且确实 - 你能展示你的 POM 的相关部分吗?

Edit:您的 EAR 模块应该仅引用 EJB JAR 和 WAR 作为依赖项。默认情况下,任何传递依赖项都应自动包含在 EAR 中,位于顶层 - 这可以用<defaultLibBundleDir>耳内标签插件<configuration>:

<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.7</version>
<configuration>
    <defaultLibBundleDir>lib</defaultLibBundleDir>
    <archive>
        <manifest>
            <addClasspath>true</addClasspath>
        </manifest>
    </archive>
    <modules>
       ... etc.

还有<archive>/<addClasspath>部分应确保 MANIFEST 类路径设置正确。也许这正是您所缺少的?

Cheers,

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在java EE中,我应该将哪些jar放在库目录中? 的相关文章

随机推荐

  • 单页应用程序和 RESTful API

    真正的 RESTful API 利用超媒体 以便客户端仅依赖服务器提供的动态超媒体来浏览应用程序 该概念称为HATEOAS 这个概念很容易适用于 Web 应用程序 但如何将其应用到单页应用程序 因为 SPA 通常在内部管理其状态 就导航而言
  • 为什么 C++ 标准库中没有 std::thread_pool ?

    我觉得奇怪的是 尽管有大量的多线程构造 但该标准却缺少线程池类 什么原因可能会阻止委员会将其添加到标准中 C 与 C 一样 旨在为程序员提供尽可能多的控制权 C 中的几乎所有内容都是一个非常简单的包装器 这使程序员可以自由地实现他们想要的任
  • Oracle MIN 作为分析函数 - ORDER BY 的奇怪行为?

    这种特殊情况是从一个示例中提炼出来的 在该示例中 程序员假设对于两次装运到罐车的货物 第 1 行将首先装载 我更正了这个问题 以允许以任何顺序执行加载 但是 我发现MIN OVER PARTITION BY 允许ORDER BY在 Orac
  • 为什么 C++ 不能用 LR(1) 解析器解析?

    我正在阅读有关解析器和解析器生成器的内容 并在维基百科的 LR 解析页面中找到了此声明 许多编程语言都可以使用 LR 解析器的某些变体进行解析 一个值得注意的例外是 C 为什么会这样呢 C 的什么特殊属性导致它无法用 LR 解析器进行解析
  • 获取一个 python docker 容器与 redis docker 容器交互

    我对 docker redis 和任何类型的网络都很陌生 至少我知道 python 首先 我已经弄清楚如何获取 redis docker 映像并在 docker 容器中运行它 docker run name some redis d red
  • SSRS网页错误状态代码500

    已经部署了许多引用相同视图的报表部分 但是其中一个无法在服务器上运行 我认为这可能是由于参数到位 其中包含各种字符 这是我收到的错误消息 有谁对如何解决这个问题有任何建议 Webpage error details User Agent M
  • Angular - 如何以百分比形式设置输入字段格式,但在编辑时删除百分比?

    我试图找到一种方法 在初始页面加载时以百分比 例如 97 52 显示 html 输入字段 通过角度服务获取到后端的数据 即可观察 订阅 但也有此输入字段松散 当我编辑它时 即引发 DOM 焦点 事件时 它是百分比格式 格式数据绑定到模型 我
  • 发送“var_dump”到 FireBug 控制台

    如你所知var dump 除了价值展示其数据类型 and length 有什么方法可以将其输出记录到火虫控制台 I tried FirePHP and 消防记录器但两者都只输出变量值 有时甚至是不正确的变量值 也许你需要的是这样的 func
  • Three.js - 在单个点云中使用多个纹理

    我正在尝试使用 ShaderMaterial 在单个点云中使用多个纹理 我将纹理数组与纹理索引属性一起传递给着色器 并选择要在片段着色器中使用的适当纹理 相关设置代码 var particleCount 100 var uniforms t
  • 如何对 android aab 捆绑包使用 ProductFlavors

    我尝试通过productFlavors 构建不同的Android 应用程序包 为了保存和测试文件 我需要一个固定的文件名 对于 APK 我有以下工作代码 applicationVariants all variant gt if varia
  • Android ListView - 在“整”行位置停止滚动

    抱歉 标题令人困惑 我无法非常简洁地表达问题 我有一个带有 ListView 的 Android 应用程序 它使用圆形 无限 适配器 这基本上意味着我可以根据需要向上或向下滚动它 并且当它到达顶部或底部时 项目将环绕 使其看起来对于用户来说
  • Kotlin - 不重复的随机数

    我有一个问题 如何防止随机数重复 顺便问一下 有人可以向我解释如何对这些随机数进行排序吗 override fun onCreate savedInstanceState Bundle super onCreate savedInstanc
  • 使用 Maven 程序集排除文件不起作用

    我有非常简单的程序集描述符
  • Typescript 实现具有相同键但不同类型的接口

    我有一个界面 export interface Foo a string b string 我现在想要另一个类 它实现接口的所有键 但可以有另一种类型 export class Bar implements keysof Foo a Som
  • 如果 HTTP 代码的curl getinfo 没有返回代码?

    我正在对 Web 服务进行正常的curl 调用 并通过以下方式获取返回的 HTTP 代码 code curl getinfo ch CURLINFO HTTP CODE 它确实返回给我 code 作为 200 这很好 但是从一周开始记录cu
  • 如何删除空关联数组条目

    我有一个关联数组 csv arr Array 0 gt Array Enfalac gt alpha linolenic acid 300 mg Enfapro gt alpha linolenic acid 200 mg 1 gt Arr
  • Push_back 与 emplace_back

    我对之间的区别有点困惑push back and emplace back void emplace back Type Val void push back const Type Val void push back Type Val 由
  • C# 将 MM dd yyyy 格式字符串转换为日期时间

    我有 MMddyy 格式的字符串 例如 112192 我需要将其转换为 DateTime 对象 如果我尝试分割字符串并使用new DateTime yy mm dd 但将年份设置为 0092 但我需要将其设置为 1992 我也尝试过这个 D
  • 在 edmx 中重命名列的最佳方法是什么?

    我正在使用实体框架 4 0 我的方法是数据库优先方法 在 edmx 中重命名列名称或更改列的数据类型的最佳方法是什么 提前致谢 要重命名列 在 SQL Management Studio 中重命名该列 在 EDMX 编辑器中 选择 从数据库
  • 在java EE中,我应该将哪些jar放在库目录中?

    我有一个 Java EE 项目 该项目使用 Maven 构建为 ear 存档 有一个包含JPA 2持久单元的库jar 它位于ear的库目录中 因此多个其他模块可以使用它 在将 Shiro 的 Permission 接口的实现添加为该持久性单