我刚开始使用Log4J.我创建了一个log4j.properties文件并将其放在Eclipse的项目文件夹中.我还为我的应用程序创建了一个Run配置(它只是一个默认的Run配置,没有额外的选项).
现在,我尝试运行应用程序,并收到有关log4j无法初始化自身的错误消息(读取属性文件).我知道属性文件必须在类路径中,所以显然Run配置没有正确设置类路径.
如果我转到Run配置的Classpath选项卡,我有以下内容:
但是,如果我手动添加项目的文件夹(我单击添加文件夹,高级,MyApplication),log4j将能够自己初始化.
为什么会这样?除非我手动添加项目的文件夹,为什么log4j找不到属性文件?默认情况下,这个文件夹不在类路径中吗?(以上输出表明它是.)
我正在开发glassfish v3上的j2ee应用程序,它将远程调用部署在jboss 5 app服务器上的EJB.为此,我的应用程序必须在类路径中有jboss客户端jar.我设法通过使用我的应用程序打包客户端jar文件来完成此操作,但这会通过aprox 10mb消耗大小,因此上传应用程序成为一个问题.
我怎么能把这些罐子放在别处,以便gf把它们拿起来所以我不需要把它们放在我的应用程序中?
我看到了这个:
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/>
Run Code Online (Sandbox Code Playgroud)
在我的Eclipse .classpath文件中多次创建一个新的Maven项目时,但我似乎无法弄清楚 - 排除="**"的意思是什么?
编辑:我想我想在这里得到的是,虽然看起来像exclude ="**"应该排除src/main/resources中的所有内容,但是 - 它没有.当我创建一个测试项目并放入文件夹(例如:META-INF)时,它们实际上会显示在目标/类中.为什么?那么排除的重点是什么?
TIA
上下文:一个新类说Bar,在运行时注入JVM.这个类属于com.foo这个包.对此类的引用将注入到属于同一包的另一个类中.每次加载时,新类可能都有不同的名称 - 因此不能将其指定为任何配置文件的一部分 - 例如,不能在build.xml中指定它作为jar文件的一部分包含在内.
问题:在类加载时,jvm会抛出一个错误 - java结果1.尽管我无法确定根本原因,但看起来类加载器找不到新注入的类.服务器以详细模式运行,该模式显示JVM加载的类列表,并且可以看到这个新注入的类已加载.
问题:新注入的类是否已经在类路径中?如果没有怎么设置呢?
[编辑] - 在问题中添加一些代码.
代码段 - 1:下面的代码段是从PreMain方法调用的 - Premain方法将由JVM代理调用,并将在运行时注入检测引用.Premain方法从一个方法中返回一个新类--Bar - 和一个对这个新类的引用 - returnsABool() - 在一个现有的类中 - ExistingClass.
public static void premain(String agentArgs, Instrumentation inst) {
// 1. Create and load the new class - Bar
String className = "Bar";
byte [] b = getBytesForNewClass();
//override classDefine (as it is protected) and define the class.
Class clazz = null;
try {
ClassLoader loader = ClassLoader.getSystemClassLoader();
Class cls = Class.forName("java.lang.ClassLoader");
java.lang.reflect.Method method =
cls.getDeclaredMethod("defineClass", …Run Code Online (Sandbox Code Playgroud) 我有一个简单的Java文件Q.java,它依赖于外部库文件X.jar.Q.java和X.jar都在同一目录中.我可以通过执行以下命令从命令行编译Q.java:"javac -cp X.jar Q.java".这会生成一个Q.class文件.我该如何运行呢?我尝试了所有这些:
1)java Q 2)java -cp X.jar Q.
我一直在线程"main"中得到一个异常java.lang.NoClassDefFoundError:Q引起:java.lang.ClassNotFoundException:Q
那么我现在如何从命令行运行它,因为我有类文件?
我正在使用maven来构建我的项目.它早先成功编译.当我这样做时,它已经开始出错了mvn clean install.
[ERROR] classpath error: unable to find org.aspectj.lang.JoinPoint (check that aspectjrt.jar is in your classpath)
下面是我的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>com.guavus</groupId>
<artifactId>Exporter</artifactId>
<version>atlas2.1</version>
<packaging>jar</packaging>
<name>Exporter</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<aspectj.version>1.6.10</aspectj.version>
<org.springframework.version>3.0.5.RELEASE</org.springframework.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.0-beta-2</version>
<configuration>
<reportPlugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.7</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jxr-plugin</artifactId>
<version>2.1</version>
<configuration>
<aggregate>true</aggregate>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-report-plugin</artifactId>
<version>2.6</version>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.4</version>
<configuration>
<formats>
<format>xml</format>
<format>html</format>
</formats>
</configuration>
</plugin>
<!--
plugin> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>2.6</version> </plugin …Run Code Online (Sandbox Code Playgroud) 我有一个Jmx客户端,用于测试我写的jmx bean.这是客户端的代码:
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:8686/jmxrmi");
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
ObjectName mbeanName = new ObjectName("com.spmsoftware.processing.ping:type=ProcessingPing");
ProcessingPing mbeanProxy = JMX.newMBeanProxy(mbsc, mbeanName, ProcessingPing.class, true);
System.out.println("\nResult = " + mbeanProxy.ping(346, 0).getResultCode());
jmxc.close();
Run Code Online (Sandbox Code Playgroud)
ProcessingPing及其所有依赖项都存在于IntelliJ库中.
我的jmx bean是:
public interface ProcessingPing {
public PingResult ping(Integer environmentId, Integer timeout);
}
Run Code Online (Sandbox Code Playgroud)
和
@Service("ProcessingPing")
@ManagedResource(description = "")
public class ProcessingPingImpl implements ProcessingPing {
private static final Integer DEFAULT_TIMEOUT = 5000;
@Autowired
private PingProcessService pingProcessService;
@Override
@ManagedOperation(description = "")
public PingResult ping(Integer environmentId, Integer …Run Code Online (Sandbox Code Playgroud) 我已经搜索了互联网,也已经搜索了stackoverflow,发现很多帖子都在问这个问题,但是还没有一个具体的答案。
简短的版本是:我有一个jar文件,该文件引用清单中的其他jar文件。然后,我使用java -jar test.jar运行jar文件,但是它没有将jar依赖项添加到类路径中。
加长版:我做了一个小实验,以确认它对我的项目来说不是什么特别的事情。我在eclipse中创建了一个简单的Java项目,只有一个类。该类所做的只是将类路径写入std-out:
package test;
import java.net.URL;
import java.net.URLClassLoader;
public class Test {
public static void main(String[] args){
ClassLoader cl = ClassLoader.getSystemClassLoader();
URL[] urls = ((URLClassLoader)cl).getURLs();
for(URL url: urls){
System.out.println("CP: "+url.getFile());
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我创建了一个“ lib”文件夹,并在其中放置了一个随机的jar文件,并将其添加到类路径中。现在,文件夹结构如下所示:
Test
|- src/test/Test.java
|- lib/mysql-connector-java-3.1.14-bin.jar
Run Code Online (Sandbox Code Playgroud)
现在,当我从Eclipse运行它时,将得到以下输出:
CP: /home/username/workspace/Test/bin/
CP: /home/username/workspace/Test/lib/mysql-connector-java-3.1.14-bin.jar
Run Code Online (Sandbox Code Playgroud)
好的,现在我使用Eclipse将项目导出到可运行的jar中。我选择选项“将所需的库复制到生成的jar旁边的子文件夹中”。
这将创建以下结构:
/tmp/Test
|- test.jar
|- test_lib/mysql-connector-java-3.1.14-bin.jar
Run Code Online (Sandbox Code Playgroud)
如果查看由Eclipse创建的Test.jar,它看起来像这样:
test.jar
|- test/Test.class
|- META-INF/MANIFEST.MF
Run Code Online (Sandbox Code Playgroud)
MANIFEST.MF的内容是:
Manifest-Version: 1.0
Class-Path: . test_lib/mysql-connector-java-3.1.14-bin.jar
Main-Class: test.Test
Run Code Online (Sandbox Code Playgroud)
是的,在Main-Class属性后面有一个空行(我之所以提到这一点,是因为有些人在网上发布原因可能是结尾处缺少换行符)。
因此,一切看起来都很好。我使用java -jar test.jar运行它并获得以下输出:
CP: /tmp/Test/test.jar
Run Code Online (Sandbox Code Playgroud)
因此,类路径 …
我正在构建一个基于Spring Boot的Spring独立应用程序.我希望这个应用程序从一个独立目录中的jar文件之外的属性文件中读取它的属性.构建的应用程序的结构如下所示
testApplication
??? test-1.0-SNAPSHOT.jar
??? lib
? ??? <dependencies are here>
??? conf
??? application.properties
Run Code Online (Sandbox Code Playgroud)
我想在classpath上加载application.properties文件,所以我能够在我的应用程序中读取.可能吗?因为当我像这样运行我的jar文件时(在Windows上):
java -cp "./*;lib/*;conf/*" com.myapp.Test
Run Code Online (Sandbox Code Playgroud)
我得到以下的例外:
Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.myapp.Test]; nested exception is java.io.FileNotFoundException: class path resource [application.properties] cannot be opened because it does not exist
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:180)
...
Caused by: java.io.FileNotFoundException: class path resource [application.properties] cannot be opened because it does not exist
at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:172)
Run Code Online (Sandbox Code Playgroud)
我尝试通过此类注释从应用程序中读取文件:
@PropertySource("classpath:application.properties")
Run Code Online (Sandbox Code Playgroud)
Java文档没有提到,可以在类路径上加载非jar文件,但如果这个application.properties在jar文件test-1.0-SNAPSHOT.jar中,则可以通过这种方式访问它.
是否可以将外部非jar文件放在类路径上?我知道我不一定在classpath上有文件,我可以通过不同的方式访问它,但我仍然很好奇,如果可能的话.
我正在制作一个使用sparql端点服务的maven应用程序.我想有一个maven目标来下载sparql端点并启动服务,但似乎maven在配置类路径时遇到一些问题.
我在https://mvnrepository.com/artifact/com.blazegraph/bigdata-jar上使用了blazegraph及其工件.
这是我在pom.xml中的插件配置:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>com.bigdata.rdf.sail.webapp.StandaloneNanoSparqlServer</mainClass>
<includePluginDependencies>true</includePluginDependencies>
<includeProjectDependencies>false</includeProjectDependencies>
<executableDependency>
<groupId>com.blazegraph</groupId>
<artifactId>blazegraph-jar</artifactId>
</executableDependency>
<addOutputToClasspath>false</addOutputToClasspath>
</configuration>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.blazegraph/blazegraph-jar -->
<dependency>
<groupId>com.blazegraph</groupId>
<artifactId>blazegraph-jar</artifactId>
<version>2.1.4</version>
<scope>runtime</scope>
<type>jar</type>
</dependency>
</dependencies>
</plugin>
Run Code Online (Sandbox Code Playgroud)
调试输出提示插件无法找到工件:
Caused by: java.lang.NullPointerException
at org.codehaus.mojo.exec.AbstractExecMojo.findExecutableArtifact(AbstractExecMojo.java:278)
at org.codehaus.mojo.exec.ExecJavaMojo.determineRelevantPluginDependencies(ExecJavaMojo.java:650)
at org.codehaus.mojo.exec.ExecJavaMojo.addRelevantPluginDependenciesToClasspath(ExecJavaMojo.java:568)
at org.codehaus.mojo.exec.ExecJavaMojo.getClassLoader(ExecJavaMojo.java:520)
at org.codehaus.mojo.exec.ExecJavaMojo.execute(ExecJavaMojo.java:301)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
... 27 more
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
编辑1 这个问题不是什么是NullPointerException的副本,我该如何解决?因为Maven抛出异常,因为它无法在依赖项列表中找到正确的工件(但它应该).
编辑2 感谢@Sean Patrick Floyd,我已经部分解决了这个问题.我想,类路径配置中仍然存在一些问题.现在Maven找到了主类和jar,但是在执行之后我在编译代码中得到了另一个NPE.查看blazegraph的开源代码,似乎无法打开可执行jar内的资源.
以下是导致NPE的行:
System.setProperty("jetty.home",
jettyXml.getClass().getResource("/war").toExternalForm());
Run Code Online (Sandbox Code Playgroud)
classpath nullpointerexception maven-3 maven exec-maven-plugin