我从最初提出这个问题后就修改了这个问题。请参阅更新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>
然后我做了:
所有运行都没有错误。
它在我的\ 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文件。
有什么想法吗?