0

我已经编写了一个 javafx 应用程序并通过 Intellij 的“构建工件”功能构建了一个 jar 文件。现在,如果我像这样在输出文件夹中运行 jar 文件:

java -jar IdeaProjects/Transclip/out/artifacts/Transclip/Transclip.jar

一切正常,但如果我将它复制到其他地方:

cp  IdeaProjects/Transclip/out/artifacts/Transclip/Transclip.jar  .IdeaProjects/Transclip/out/artifacts/Transclip/Transclip.jar -> ./Transclip.jar
java -jar Transclip.jar

然后我得到很多错误:

Exception in Application constructor
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:367)
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:305)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Unable to construct Application instance: class sample.Main
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:884)
    at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:56)
    at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:158)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
    at com.sun.javafx.application.LauncherImpl$7.run(LauncherImpl.java:791)
    at com.sun.javafx.application.PlatformImpl$7.run(PlatformImpl.java:335)
    at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:301)
    at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:298)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl$6.run(PlatformImpl.java:298)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/collections4/BidiMap
    at sample.Main.<init>(Main.java:48)
    ... 11 more
Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections4.BidiMap
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 12 more
Exception running application sample.Main

知道这里发生了什么吗?

这是 MANIFEST.MF 的内容:

Manifest-Version: 1.0
Main-Class: sample.Main

这是文件结构:

.
├── Transclip.iml
├── libs
│   ├── commons-collections4-4.0.jar
│   └── gson-2.2.4.jar
├── out
│   ├── artifacts
│   │   ├── Transclip
│   │   │   ├── Transclip.html
│   │   │   ├── Transclip.jar
│   │   │   ├── Transclip.jnlp
│   │   │   ├── commons-collections4-4.0.jar
│   │   │   └── gson-2.2.4.jar
│   │   └── Transclip_jar
│   │       └── Transclip.jar
│   └── production
│       └── Transclip
│           ├── META-INF
│           │   └── MANIFEST.MF
│           ├── com
│           │   ├── detectlanguage
│           │   │   ├── Client.class
│           │   │   ├── DetectLanguage.class
│           │   │   ├── Result.class
│           │   │   ├── errors
│           │   │   │   └── APIError.class
│           │   │   └── responses
│           │   │       ├── BatchDetectResponse.class
│           │   │       ├── BatchDetectionsData.class
│           │   │       ├── DetectResponse.class
│           │   │       ├── DetectionsData.class
│           │   │       ├── ErrorData.class
│           │   │       ├── ErrorResponse.class
│           │   │       ├── Response.class
│           │   │       └── StatusResponse.class
│           │   └── gtranslate
│           │       ├── Audio.class
│           │       ├── Language.class
│           │       ├── Main.class
│           │       ├── Translator.class
│           │       ├── URLCONSTANTS.class
│           │       ├── parsing
│           │       │   ├── Parse.class
│           │       │   ├── ParseTextDetect.class
│           │       │   └── ParseTextTranslate.class
│           │       ├── text
│           │       │   ├── Text.class
│           │       │   └── TextTranslate.class
│           │       └── utils
│           │           └── WebUtils.class
│           ├── javazoom
│           │   └── jl
│           │       ├── converter
│           │       │   ├── Converter$PrintWriterProgressListener.class
│           │       │   ├── Converter$ProgressListener.class
│           │       │   ├── Converter.class
│           │       │   ├── RiffFile$RiffChunkHeader.class
│           │       │   ├── RiffFile.class
│           │       │   ├── WaveFile$WaveFileSample.class
│           │       │   ├── WaveFile$WaveFormat_Chunk.class
│           │       │   ├── WaveFile$WaveFormat_ChunkData.class
│           │       │   ├── WaveFile.class
│           │       │   ├── WaveFileObuffer.class
│           │       │   ├── jlc$jlcArgs.class
│           │       │   └── jlc.class
│           │       ├── decoder
│           │       │   ├── BitReserve.class
│           │       │   ├── Bitstream.class
│           │       │   ├── BitstreamErrors.class
│           │       │   ├── BitstreamException.class
│           │       │   ├── Control.class
│           │       │   ├── Crc16.class
│           │       │   ├── Decoder$Params.class
│           │       │   ├── Decoder.class
│           │       │   ├── DecoderErrors.class
│           │       │   ├── DecoderException.class
│           │       │   ├── Equalizer$EQFunction.class
│           │       │   ├── Equalizer.class
│           │       │   ├── FrameDecoder.class
│           │       │   ├── Header.class
│           │       │   ├── InputStreamSource.class
│           │       │   ├── JavaLayerError.class
│           │       │   ├── JavaLayerErrors.class
│           │       │   ├── JavaLayerException.class
│           │       │   ├── JavaLayerHook.class
│           │       │   ├── JavaLayerUtils.class
│           │       │   ├── LayerIDecoder$Subband.class
│           │       │   ├── LayerIDecoder$SubbandLayer1.class
│           │       │   ├── LayerIDecoder$SubbandLayer1IntensityStereo.class
│           │       │   ├── LayerIDecoder$SubbandLayer1Stereo.class
│           │       │   ├── LayerIDecoder.class
│           │       │   ├── LayerIIDecoder$SubbandLayer2.class
│           │       │   ├── LayerIIDecoder$SubbandLayer2IntensityStereo.class
│           │       │   ├── LayerIIDecoder$SubbandLayer2Stereo.class
│           │       │   ├── LayerIIDecoder.class
│           │       │   ├── LayerIIIDecoder$III_side_info_t.class
│           │       │   ├── LayerIIIDecoder$SBI.class
│           │       │   ├── LayerIIIDecoder$Sftable.class
│           │       │   ├── LayerIIIDecoder$gr_info_s.class
│           │       │   ├── LayerIIIDecoder$temporaire.class
│           │       │   ├── LayerIIIDecoder$temporaire2.class
│           │       │   ├── LayerIIIDecoder.class
│           │       │   ├── Manager.class
│           │       │   ├── Obuffer.class
│           │       │   ├── OutputChannels.class
│           │       │   ├── SampleBuffer.class
│           │       │   ├── Source.class
│           │       │   ├── SynthesisFilter.class
│           │       │   ├── au2lin.ser
│           │       │   ├── huffcodetab.class
│           │       │   ├── l3reorder.ser
│           │       │   ├── lin2au.ser
│           │       │   ├── readme.txt
│           │       │   └── sfd.ser
│           │       └── player
│           │           ├── AudioDevice.class
│           │           ├── AudioDeviceBase.class
│           │           ├── AudioDeviceFactory.class
│           │           ├── FactoryRegistry.class
│           │           ├── JavaSoundAudioDevice.class
│           │           ├── JavaSoundAudioDeviceFactory.class
│           │           ├── NullAudioDevice.class
│           │           ├── Player.class
│           │           ├── PlayerApplet.class
│           │           ├── advanced
│           │           │   ├── AdvancedPlayer.class
│           │           │   ├── PlaybackEvent.class
│           │           │   ├── PlaybackListener.class
│           │           │   ├── jlap$1.class
│           │           │   ├── jlap$InfoListener.class
│           │           │   └── jlap.class
│           │           └── jlp.class
│           └── sample
│               ├── LangMap.class
│               ├── Main$1.class
│               └── Main.class
├── readme.md
├── resources
│   └── images
│       └── Transclip.svg
└── src
    ├── META-INF
    │   └── MANIFEST.MF
    ├── com
    │   ├── detectlanguage
    │   │   ├── Client.java
    │   │   ├── DetectLanguage.java
    │   │   ├── Result.java
    │   │   ├── errors
    │   │   │   └── APIError.java
    │   │   └── responses
    │   │       ├── BatchDetectResponse.java
    │   │       ├── BatchDetectionsData.java
    │   │       ├── DetectResponse.java
    │   │       ├── DetectionsData.java
    │   │       ├── ErrorData.java
    │   │       ├── ErrorResponse.java
    │   │       ├── Response.java
    │   │       └── StatusResponse.java
    │   └── gtranslate
    │       ├── Audio.java
    │       ├── Language.java
    │       ├── Main.java
    │       ├── Translator.java
    │       ├── URLCONSTANTS.java
    │       ├── parsing
    │       │   ├── Parse.java
    │       │   ├── ParseTextDetect.java
    │       │   └── ParseTextTranslate.java
    │       ├── text
    │       │   ├── Text.java
    │       │   └── TextTranslate.java
    │       └── utils
    │           └── WebUtils.java
    ├── javazoom
    │   └── jl
    │       ├── converter
    │       │   ├── Converter.java
    │       │   ├── RiffFile.java
    │       │   ├── WaveFile.java
    │       │   ├── WaveFileObuffer.java
    │       │   └── jlc.java
    │       ├── decoder
    │       │   ├── BitReserve.java
    │       │   ├── Bitstream.java
    │       │   ├── BitstreamErrors.java
    │       │   ├── BitstreamException.java
    │       │   ├── Control.java
    │       │   ├── Crc16.java
    │       │   ├── Decoder.java
    │       │   ├── DecoderErrors.java
    │       │   ├── DecoderException.java
    │       │   ├── Equalizer.java
    │       │   ├── FrameDecoder.java
    │       │   ├── Header.java
    │       │   ├── InputStreamSource.java
    │       │   ├── JavaLayerError.java
    │       │   ├── JavaLayerErrors.java
    │       │   ├── JavaLayerException.java
    │       │   ├── JavaLayerHook.java
    │       │   ├── JavaLayerUtils.java
    │       │   ├── LayerIDecoder.java
    │       │   ├── LayerIIDecoder.java
    │       │   ├── LayerIIIDecoder.java
    │       │   ├── Manager.java
    │       │   ├── Obuffer.java
    │       │   ├── OutputChannels.java
    │       │   ├── SampleBuffer.java
    │       │   ├── Source.java
    │       │   ├── SynthesisFilter.java
    │       │   ├── au2lin.ser
    │       │   ├── huffcodetab.java
    │       │   ├── l3reorder.ser
    │       │   ├── lin2au.ser
    │       │   ├── readme.txt
    │       │   └── sfd.ser
    │       └── player
    │           ├── AudioDevice.java
    │           ├── AudioDeviceBase.java
    │           ├── AudioDeviceFactory.java
    │           ├── FactoryRegistry.java
    │           ├── JavaSoundAudioDevice.java
    │           ├── JavaSoundAudioDeviceFactory.java
    │           ├── NullAudioDevice.java
    │           ├── Player.java
    │           ├── PlayerApplet.java
    │           ├── advanced
    │           │   ├── AdvancedPlayer.java
    │           │   ├── PlaybackEvent.java
    │           │   ├── PlaybackListener.java
    │           │   └── jlap.java
    │           └── jlp.java
    └── sample
        ├── LangMap.java
        └── Main.java

42 directories, 192 files
4

1 回答 1

0

当您从构建的输出目录执行 jar 文件时,它会在同一目录中找到 commons-collection 依赖项。当你将 jar 文件复制到别处并在那里执行时,它再也找不到 commons-collection 依赖项。这就是它抛出 ClassNotFoundException 的原因。您还需要复制依赖项,而不仅仅是 jar。

您还应该考虑将这部分作为构建的一部分,以便将依赖项复制到构建输出的 lib 文件夹中,并且您的清单知道引用 lib 文件夹中的依赖项。如果您不想使用所有必需的依赖项更新 manfiest,那么您必须在 java 命令的 -classpath 参数中指定它们,如果依赖项的数量增加,这并不理想。

于 2014-08-04T15:25:31.000 回答