奇怪的Maven nullpointer

时间:2018-04-17 07:32:13

标签: java intellij-idea maven-3 executable-jar artifact

我从最初提出这个问题后就修改了这个问题。请参阅更新1部分,特别是最后的更新2部分。

我正在构建一个包含大量依赖项的大型JavaFX应用程序。我正在使用IntelliJ来完成这项工作,并且正处于部署阶段。我正在使用IntelliJ自己的工件教程来构建可执行jar。可以在"Working with artifacts" tutorial on jetbrains

中看到该教程

我已经构建了我的可执行jar并且它正常工作,但有一点需要注意:

我必须为可执行jar文件手动模仿IntelliJ项目的目录结构,以找到程序正常运行所需的资源。

这是我提出的问题:IntelliJ不应该在工件中包含这些文件,因此它可以自行运行吗?

我在IntelliJ中的目录结构如下所示:

Project root
  .idea
  .out
  .src
    .main
      .java
        .com
          .myCompany
            .package-with-classes1
              .class1 ... N
            .package-with-classes2
              .class1 ... N
                .package-with-files
                  .file1.someExtension
                  .file2.someExtension
            .other-package-classes
            .and-so-on

当我在Project Structure - Artifacts - Output Layout下构建工件时,我然后手动添加目录结构,如上所示,然后将文件放在它们所属的位置。

根据我上面的问题,我希望这些文件能够自动包含在可执行jar文件中。

更新1:将Maven添加到项目

由于Andrey's comment我现在已经在我的项目中实现了Maven。我有很多的外部依赖项,我已经添加到我的pom.xml文件中,如下所示:

<dependency>
    <groupId>some.group.id</groupId>
    <artifactId>some-artifact-id</artifactId>
    <scope>system</scope>
    <version>1.0.0</version>
    <systemPath>${basedir}\path\to\jar\jarfile.jar</systemPath
</dependency>
然后我做了:

  1. mvn clean
  2. mvn compile
  3. mvn package
  4. 所有运行都没有错误。

    它在我的\ target文件夹中放置了2个jar文件:(1)name-of-jar.jar和(2)name-of-jar-with-dependencies.jar。

    Running(1)抛出错误:没有主清单属性。 Running(2)抛出ClassNotFoundException和NoClassDefFoundError错误。为什么是这样?使用上述方法将抛出错误的类作为依赖项包含在内。

    更新2:Maven的进展,但......

    我通过将所有第三方jar库安装到C:\ Users \ $ USER $ .m2 \ repository的本地计算机的Maven存储库,解决了 UPDATE 1 部分中的问题。但是,获取空指针......

    我将pom.xml中的依赖声明更改为以下内容:

    <dependency>
        <groupId>some.group.id</groupId>
        <artifactId>some-artifact-id</artifactId>
        <version>some.version.number</version>
    </dependency>
    

    我目前正在使用maven程序集插件构建我的胖罐(我也尝试过使用shave插件但是我遇到了同样的问题)。这是我的pom.xml中汇编插件的摘录:

     <plugin>
         <artifactId>maven-assembly-plugin</artifactId>
         <configuration>
             <archive>
                 <manifest>
                     <mainClass>com.myCompany.myMainClass</mainClass>
                 </manifest>
             </archive>
             <descriptorRefs>
                 <descriptorRef>jar-with-dependencies</descriptorRef>
             </descriptorRefs>
         </configuration>
         <executions>
             <execution>
                 <id>make-assembly</id>
                 <phase>package</phase>
                 <goals>
                     <goal>single</goal>
                 </goals>
             </execution>
         </executions>
     </plugin>
    

    这将在\ target目录中生成相同的两个jar文件,如 UPDATE 1 部分所述。

    现在,如果我运行jar -tf name-of-jar-with-dependencies.jar,我可以从这个jar的目录内容看到jar实际上确实包含了所有缺少的第三方jar库;并使用java -jar name-of-jar-with-dependencies.jar运行jar文件不会再出现 UPDATE 1 部分中所述的错误。到现在为止还挺好。

    但是,它会抛出一个令我困惑的NullPointerException。具体来说,它抱怨某个班级缺失。这对我来说有点奇怪,因为这个类是第三方jar库的一部分,我将 添加为我的pom.xml中的依赖项。这个类确实包含在最后一个jar中这一事实得到了上面的方法的证实,打印出jar-with-dependencies.jar名称的内容,其中包括很多其他文件 - 包括这个jar文件。

    有什么想法吗?

0 个答案:

没有答案