我已经安装了一个应用程序,当我尝试运行它时(它是一个可执行的jar)没有任何反应.当我从命令行运行它时:
java -jar"app.jar"
我收到以下消息:
"app.jar"中没有主要的清单属性
通常,如果我自己创建了程序,我会在清单文件中添加一个主类属性.但在这种情况下,由于文件来自应用程序,我不能这样做.我也尝试提取jar以查看是否可以找到主类,但是有许多类,并且它们中没有一个在其名称中包含"main"一词.必须有办法解决这个问题,因为程序在其他系统上运行正常.
我在我的独立应用程序中使用Maven,并且我想将我的JAR文件中的所有依赖项打包到库文件夹中,如下面的答案中所述:
我希望我的最终JAR文件有一个库文件夹,其中包含作为JAR文件的依赖项,而不是maven-shade-plugin将依赖项放在.m2文件夹中的Maven层次结构等文件夹形式的内容.
好吧,实际上当前的配置做了我想要的,但是我在运行应用程序时加载JAR文件时遇到了问题.我无法加载课程.
这是我的配置:
<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>
Run Code Online (Sandbox Code Playgroud)
该项目从Eclipse运行良好,JAR文件根据我的需要放在我最终的JAR文件中的库文件夹中,但是当从目标文件夹运行最终的JAR文件时,我总是得到ClassNotFoundException:
Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
Caused …Run Code Online (Sandbox Code Playgroud) 有没有办法将pom.xml文件中的依赖项下载到java中的指定文件夹?我能够从java运行maven命令,我得到了下载消息,但我不知道maven在哪里存储这些库?如何将这些依赖项下载到特定文件夹?
我有这个奇怪的问题使我的项目Maven为基础.我在Eclipse中创建了一个新的Maven项目并启用了Dynamic Web方面.但是在运行时现在它会抛出ClassNotFoundException因为Maven依赖项没有复制到WEB-INF/lib目录.我甚至尝试在POM中添加copy-dependencies部分,但它没有帮助.
有人在这里似乎已经解决了这个正确的方式,但我猜他忘了提解决方案::(
我曾经遇到过这个问题几次而且只是偶然发现了一个(半)可靠的解决方案,所以我想在这里发布它以防万一它可以帮助其他人,或者万一我忘了它,还要问是否有人知道根本原因是什么以及我的修复工作原因.
问题 - 我有一个spring 3 webapp,我想在Eclipse中使用Run on Server选项在Tomcat 7服务器上运行.对于一些项目,这只是起作用,但有些项目似乎处于破坏状态,每次服务器启动时,我都会找到一个未找到的类:org.springframework.web.servlet.DispatcherServlet.
经过一番调查,我发现,该项目的Maven依赖没有被复制到WEB-INF/lib中${PROJECT_LOCATION}/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/
在最终注意到项目在"问题"面板中发出警告之前,我尝试了很多事情:
Classpath entry org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER
will not be exported or published. Runtime ClassNotFoundExceptions may result.
Run Code Online (Sandbox Code Playgroud)
也许我应该早点注意到这一点.
无论如何,选择这个并执行"快速修复"可以解决问题,我可以愉快地运行我的项目.快速解决方法是:"将关联的原始类路径条目标记为发布/导出依赖项".
麻烦的是,虽然这有效,但我不知道这意味着什么.完成后,我的项目配置中看不到任何明显的变化.我很想知道实际问题是什么,以及我是否可以避免它再次发生.我还想知道是否有一些我本可以完成的事情(除了执行快速修复之外)可以修复它,因为我觉得我几乎尝试了其他一切.
谢谢你的帮助.
我想确保我的Maven项目中没有包含重复的库.我从几个不同的存储库中提取了很多依赖项,包括main,Spring的repo和JBoss的存储库.如何查看依赖关系图,以便确保我不依赖于单个库的多个版本?
如果我包含类似的东西org.springframework:spring-core:3.0.1.RELEASE 并且 org.springframework:org.springframework.spring-core:3.0.5.RELEASE实际上显示为不同的依赖关系,听起来很奇怪,那将是一种无聊,因为Spring的存储库很奇怪地命名.我该怎么做才能确保我没有重复的依赖项?
我正在使用一个使用Maven编译和测试的库.
我能够毫无问题地编译库.在编译时,似乎它下载了库的所有依赖项.
现在,我正在尝试在我的项目中使用该库.当我编译库时,我发现target在库文件夹中创建了一个名为的文件夹,在该文件夹中,还有一个名为的文件夹classes.我将classes文件夹添加到了我的类路径中.但是,每当我尝试在我的项目中使用不使用Maven的库时,它就说它无法找到该库的依赖项.
如何将所有库的依赖项添加到类路径中?
我是否需要手动下载所有库的依赖项并将它们添加到类路径中?
有什么方法可以让Maven为我这样做吗?
我需要做什么才能在项目中使用库?
我的项目位于与库完全不同的目录中.现在,我的项目似乎能够正确加载库文件,但不是库依赖项.
我正在将现有项目从GWT 1.5.2更新为GWT 2.0.0.我们使用maven 2来管理我们的依赖项,并在Eclipse 3.5中完成所有开发.
因为我们使用maven来管理我们的依赖项,所以我没有像warT指定的那样在war\web-inf\lib目录中拥有所有这些jar.相反,它们位于maven存储库中,就像maven喜欢它们一样.我已经设置了项目,以便maven可以在开发或Web模式下成功构建和启动,并且应用程序可以正常运行.
问题是当我从Eclipse启动时,我得到一个java.lang.NoClassDefFoundError.如果我在启动之前手动将我的依赖项复制到war\web-inf\lib中,一切运行正常,但这并不适合长期解决方案.首先,如果我将所有这些罐子检查到我们的版本控制中,那将破坏我们从maven获得的大部分价值.像maven一样恼人,抛弃它不是答案.其次,让开发人员在每次调试时手动复制它们都是荒谬的.
那么我可以让Eclipse在启动之前将依赖项复制到war\web-inf\lib中吗?有没有我想念的替代解决方案?
谢谢,
托尼
我们在构建过程中使用ANT,并且没有计划在不久的将来更改它.
是否可以使用Maven来获取常见的Open Source jar文件(例如Log4J,SWT,JFace)并将它们放在我们项目的正确位置,这样我们就不必将它们存储在我们的版本控制中 - 最好不要创建主目录中的典型Maven-cache?
如果我在Eclipse中运行我的项目一切都很好.但当我这样做时:
mvn clean
mvn package
Run Code Online (Sandbox Code Playgroud)
然后开始我的项目然后它不工作.我发现了这个区别:
日食:
INFO org.eclipse.jetty.server.Server:doStart:327 ~ jetty-9.2.13.v20150730
Run Code Online (Sandbox Code Playgroud)
mvn包:
INFO org.eclipse.jetty.server.Server:doStart:327 ~ jetty-9.2.z-SNAPSHOT
Run Code Online (Sandbox Code Playgroud)
为什么?我能做什么,mvn package装载相同的码头版本9.2.13?
更新:
我发现了一些额外的差异:
在Eclipse中编译(WebApplicationInitializer):
org.eclipse.jetty.server.Server:doStart:327 ~ jetty-9.2.13.v20150730
org.eclipse.jetty.server.handler.ContextHandler$Context:log:2052 ~ No Spring WebApplicationInitializer types detected on classpath
Run Code Online (Sandbox Code Playgroud)
使用mvn package(ServletContainerInitializers)进行编译:
org.eclipse.jetty.server.Server:doStart:327 ~ jetty-9.2.z-SNAPSHOT
org.eclipse.jetty.annotations.AnnotationConfiguration:configure:456 ~ ServletContainerInitializers: detected. Class hierarchy: empty
Run Code Online (Sandbox Code Playgroud)
为什么mvn不使用WebApplication?
pom.xml中:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.myPro.test</groupId>
<artifactId>AllInOneBoiler</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>AllInOneBoiler</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<log4j.version>2.7</log4j.version>
<spring.version>4.3.3.RELEASE</spring.version>
<camel.version>2.18.3</camel.version>
<activemq.version>5.14.5</activemq.version>
<jolokia.version>1.3.5</jolokia.version>
<jetty.version>9.2.13.v20150730</jetty.version>
</properties>
<dependencies>
<!-- Log4J Start -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId> …Run Code Online (Sandbox Code Playgroud) 目前,我在启动程序时使用 JVM 参数来查找 JavaFX 库,如下所示:
java -javaagent:lib/aspectjweaver-1.9.5.jar -javaagent:lib/spring-instrument-5.2.3.RELEASE.jar --module-path lib/javafx-sdk-13.0.2/lib --add-modules=javafx.controls -jar target/Some_Service-1.0.jar
Run Code Online (Sandbox Code Playgroud)
我的 POM.xml 的插件部分非常简单。除了 Docker 和 Launch4j 插件之外,我只有这个:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉Maven将整个lib目录(其中包含JavaFX库和aspectJ/spring仪器java代理)捆绑在jar中?这样做可以解决在我部署应用程序的任何地方都必须携带该 lib 文件夹的问题!谢谢!
******编辑******
我搞乱了 spring boot maven 插件选项,不幸的是我的 jar 仍然不包含我的文件夹:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<folders>
<folder>lib</folder>
</folders>
<agent>lib/aspectjweaver-1.9.5.jar</agent>
<agent>lib/spring-instrument-5.2.3.RELEASE.jar</agent>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
*****编辑2*****
我刚刚发现了一个很棒的库,它完全消除了对 -javaagent 参数的需要,而是让您在运行时以编程方式加载它们。看来我的类路径中存在 AspectJ 和 Spring-Instrument 也正是它所需要的!查看: https: //github.com/subes/invesdwin-instrument。
我现在需要的是以某种方式将 JavaFX 运行时捆绑到我的 jar 中,而不是使用命令行参数从外部引用它。