【问题标题】:Add external libraries in a maven web application in NetBeans在 NetBeans 的 Maven Web 应用程序中添加外部库
【发布时间】:2014-11-18 15:22:24
【问题描述】:

我想将包含 API 的外部 .jar 添加到使用 NetBeans 中的模板 maven-web 应用程序创建的项目中。 似乎在使用此类模板创建的项目中,Libraries 文件夹不存在(如果您转到项目属性和查看项目文件结构,您都找不到它)。

我设法通过将 jar 复制到项目中并像这样编辑 pom.xml 文件来添加库:

   <dependency>
    <groupId>Bbg</groupId>
    <artifactId>BbgAPI</artifactId>
    <scope>system</scope>
    <version>1.0</version>
    <!-- <systemPath>C:\blp\BPipe\APIv3\JavaAPI\v3.7.1.1\bin\blpapi3.jar</systemPath> -->
    <systemPath>${basedir}\lib\blpapi3.jar</systemPath>
 </dependency>

代码编译文件,但在运行时出现错误:

java.lang.NoClassDefFoundError: com/bloomberglp/blpapi/SessionOptions

我的猜测是 JVM 在类路径中找不到类定义。 通常,当向 NetBeans 中的标准 java 项目添加外部库时(通过项目属性中的库部分),类路径会自动更新,但在这种情况下(通过手动编辑 pom.xml)似乎没有发生这种情况。

您知道如何修补类路径以使类在运行时可见吗? 一般来说,你知道为什么这个项目模板不允许以标准方式添加外部库吗?

谢谢

【问题讨论】:

  • 最好的办法是先将它安装到您的本地仓库中。见here
  • 感谢您的提示。但这假设我已经安装了 maven 并且可以从命令行运行,而我通过 netbeans 的“maven”插件使用 maven。我无法从 Windows 终端或 NetBeans 内部终端运行“mvn”。那么如何在 maven 本地存储库中安装 jar 呢?我需要从 NetBeans 外部安装 Maven 吗?这与使用 NetBeans maven 插件兼容吗?我猜外部安装会弄乱 NetBeans 中的 Maven 集成。
  • 好问题。从来没有这样做过。看看this 是否有帮助
  • 我按照那里的说明手动安装了工件,但这并没有解决问题。我可以成功构建项目,但在运行时仍然看不到库。你知道有没有办法在这样的项目中显式设置类路径?
  • 什么意思“在运行时看不到库”?你的意思是当你运行主jar时,你得到一个NoClassDefFound?通常 Netbeans 会在 MANIFEST 中为您设置类路径。并且类路径将指向build/dist 中的lib(依赖项所在的位置)。看看这个。如果您希望将其他 jar 中的类打包到主 jar 中,则需要一个 uber jar 插件,例如 maven-assembly-pluginmaven-shade-plugin

标签: maven jakarta-ee web-applications netbeans libraries


【解决方案1】:

所以在检查之后,按照this post 的说明,将依赖项添加到项目中,您仍然需要做一些事情。如果您只是像这样构建项目,您会注意到一件事,如果您在“文件”窗口中查看项目,您的 jar 不存在。

要将您的罐子复制到某个位置,您应该使用maven-dependency-plugin。类似的东西

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.8</version>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                <overWriteReleases>false</overWriteReleases>
                <overWriteSnapshots>false</overWriteSnapshots>
                <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
        </execution>
    </executions>
</plugin>

执行此操作,您应该会在 target 目录中看到 lib 中的依赖项

然后设置类路径,使用maven-jar-plugin

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.5</version>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>test.app.main.TestClass</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

这样做,您是否查看MANIFEST,您应该看到lib/yourDepenendency.jar 添加到Class-Path 属性中。你应该可以运行 jar

项目的“文件”视图。 test-app-main 是主要的 Maven 项目。我主要是一个简单的java项目test-app,我在其中创建了一个jar。

如果您想将其他 jar 中的类包含在主分发 jar 中,您将需要像 maven-assembly-pluginmaven-shade-plugin 这样的插件


更新:在大多数情况下,忽略以上所有内容。我刚刚注意到你正在创建一个 webapp

只需执行以下操作并构建您的项目应该使 jar “可用” 对于 web 应用程序

  1. 在您的项目中,右键单击“依赖项”->“添加依赖项”
  2. 给groupId、artifactId->version取任意名字,点击ok
  3. 右键单击“依赖项”中的jar,选择“手动安装工件”。找到工件并添加它。

这样做,一旦你构建它,jar 应该在 WEB-INF/libs 中可用,它应该是 webapps

但请记住,以这种方式执行此操作时,您需要确保您尝试使用的 jar 不依赖于任何其他 jar

【讨论】:

  • 太棒了!这(更新部分)已经奏效。即使 jar 没有出现在 WEB-INF/libs 中(我什至没有 WEB-INF 中的 lib 文件夹)。据我的理解,使用“向导”添加依赖项以添加依赖项(右键单击等)在 pom.xml 中添加了一些行(正如我在第一次尝试中手动所做的那样)以及其他内容(可能链接类路径)。只是为了结束这个问题:你知道这个“其他东西”到底是什么吗?
  • “即使 jar 没有出现在 WEB-INF/libs 中” - 转到 [Window] -> [Files]。查找您的项目并打开 [target] 目录。您将看到 .war 文件。打开它,您将看到 WEB-INF.lib。这就是依赖建立的地方。那是服务器将寻找它的地方。 "在 pom.xml 中添加了一些行"。没有。只是标准的坐标映射。当您“手动安装 Artifact”时,它只是将 jar 添加到您的本地存储库中,因此您可以像往常一样使用它来处理您从存储库获得的任何依赖项。
猜你喜欢
  • 1970-01-01
  • 2019-07-21
  • 2013-07-15
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 2017-07-16
相关资源
最近更新 更多