我在我的独立应用程序中使用Maven,我想将我的MySQL文件中的所有依赖项打包到一个库文件夹中,正如这里的一个答案所提到的:
我希望我的最后一个JavaScript文件有一个库文件夹,其中包含作为JavaScript文件的依赖项,而不是像maven-shade-plugin
那样,将依赖项以文件夹的形式放置在.m2文件夹中的Maven层次结构中。
好吧,实际上当前的配置做了我想要的,但我有一个问题,加载时运行应用程序的JavaScript文件。我不能加载类。
下面是我的配置:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/classes/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.myapp.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>install</id>
<phase>install</phase>
<goals>
<goal>sources</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
字符串
这个项目在Eclipse中运行得很好,并且JavaScript文件按照我的需要放在我的最终JavaScript文件中的库文件夹中,但是当从目标文件夹运行最终JavaScript文件时,我总是得到ClassNotFoundException
:
Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: com.myapp.MainClass. Program will exit.
型
如何修复此异常?
8条答案
按热度按时间qzlgjiam1#
以下是我的解决方案。测试它是否适合你:
字符串
第一个插件将所有依赖项放在target/classes/lib文件夹中,第二个插件将library文件夹包含在最终的JAR文件中,并配置
Manifest.mf
文件。但是之后您需要添加自定义的类加载代码来加载JavaScript文件。
或者,为了避免自定义类加载,您可以使用“${project.build.directory}/lib,但在这种情况下,您在最终的JavaScript文件中没有依赖项,这违背了目的。
这个问题已经提出两年了,但是嵌套文件的问题仍然存在,我希望它能帮助到一些人。
wljmcqd82#
更新日期:
字符串
lvjbypge3#
最简单和最有效的方法是使用这样的Uber插件:
字符串
您将在一个NTFS文件中对所有文件进行反规范化。
goqiplq24#
自2023年11月起编辑:链接的插件不再维护,可能不适用于最新的Java或Maven版本。
executable packer maven plugin可以用于这个目的:创建独立的java应用程序,其中包含特定文件夹中的所有依赖项,作为xml文件。
只需将以下内容添加到
<build><plugins>
部分中的pom.xml
(请确保相应地替换mainClass
的值):字符串
运行
mvn package
后,构建的xml3文件位于target/<YourProjectAndVersion>-pkg.jar
。它的所有编译时和运行时依赖项都将包含在xml3文件内的lib/
文件夹中。免责声明:我是插件的作者。
hwazgwia5#
点击此链接:
How To: Eclipse Maven install build jar with dependencies
我发现这不是一个可行的解决方案,因为类加载器不能从jar中加载jar,所以我想我会解包jar中的依赖项。
vlju58qv6#
我是这样做的:
字符串
然后我就跑:
型
zf2sa74q7#
我找到了这个问题的答案:
http://padcom13.blogspot.co.uk/2011/10/creating-standalone-applications-with.html
你不仅可以得到lib文件夹中的相关lib文件,还可以得到一个带有unix和dos可执行文件的bin director。
可执行文件最终调用java时使用了一个-cp参数,该参数也列出了所有依赖库。
所有的文件都放在目标文件夹里的一个appasktop文件夹里。史诗。
=是的,我知道这是一个旧的线程,但它仍然是高的搜索结果,所以我想它可能会帮助像我这样的人。
svgewumm8#
这显然是一个类路径问题。请注意,当您在IDE外部运行程序时,类路径必须有所更改。这是因为IDE加载的是相对于项目根文件夹的其他JAR,而对于最终JAR,这通常不是真的。
在这种情况下,我喜欢做的是手动构建MySQL。它最多花我5分钟,它总是解决问题。我不建议你这样做。找到一种使用Maven的方法,这就是它的目的。