我有一个小型 ActiveMQ 客户端,它应该只是连接到 AMQ 服务、创建队列并发送消息。我收到以下错误消息:
\n\nFailed to instantiate SLF4J LoggerFactory\nReported exception:\njava.lang.NoClassDefFoundError: org/apache/logging/log4j/spi/AbstractLoggerAdapter\n at java.lang.ClassLoader.defineClassl(Native Method)\n ...\nRun Code Online (Sandbox Code Playgroud)\n\n我的上有以下罐子classpath:
log4j-1.2-api-2.6.2.jar\nlog4j-core-2.6.2.jar\nlog4j-slf4j-impl-2.6.2.jar\n\nactivemq-broker-5.13.3.jar\nactivemq-client-5.13.3.jar\nactivemq-console-5.13.3.jar\nactivemq-jaas-5.13.3.jar\nactivemq-kahadb-store-5.13.3.jar\nactivemq-openwire-legacy-5.13.3.jar\nactivemq-protobuf-1.1.jar\nactivemq-spring-5.13.3.jar\nactivemq-web-5.13.3.jar\ngeronimo-j2ee-management_1.1_spec-1.0.1.jar\ngeronimo-jms_1.1_spec-1.1.1.jar\ngeronimo-jta_1.0.1B_spec-1.0.1.jar\nhawtbuf-1.11.jar\njcl-over-slf4j-1.7.13.jar\nslf4j-api-1.7.13.jar\nRun Code Online (Sandbox Code Playgroud)\n\n如果我去掉前三个库,我会收到错误Failed to load class \xe2\x80\x9corg.slf4j.impl.StaticLoggerBinder\xe2\x80\x9d
我尝试过搜索,但我不能说我找到了迄今为止有效的任何东西。
\n当 hive 使用 Spark 时,当我尝试查询 hive 中的表时,我遇到错误。例如,当我这样做时:
select count(*) from ma_table;
Run Code Online (Sandbox Code Playgroud)
我明白了:
Exception in thread "main" java.lang.NoClassDefFoundError: scala/collection/Iterable
at org.apache.hadoop.hive.ql.parse.spark.GenSparkProcContext.<init>(GenSparkProcContext.java:163)
at org.apache.hadoop.hive.ql.parse.spark.SparkCompiler.generateTaskTree(SparkCompiler.java:195)
at org.apache.hadoop.hive.ql.parse.TaskCompiler.compile(TaskCompiler.java:267)
at org.apache.hadoop.hive.ql.parse.SemanticAnalyzer.analyzeInternal(SemanticAnalyzer.java:10947)
at org.apache.hadoop.hive.ql.parse.CalcitePlanner.analyzeInternal(CalcitePlanner.java:246)
at org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer.analyze(BaseSemanticAnalyzer.java:250)
at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:477)
at org.apache.hadoop.hive.ql.Driver.compileInternal(Driver.java:1242)
at org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1384)
at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1171)
at org.apache.hadoop.hive.ql.Driver.run(Driver.java:1161)
at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:232)
at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:183)
at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:399)
at org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:776)
at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:714)
at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:641)
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:498)
at org.apache.hadoop.util.RunJar.run(RunJar.java:234)
at org.apache.hadoop.util.RunJar.main(RunJar.java:148)
Caused by: java.lang.ClassNotFoundException: scala.collection.Iterable
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 23 more …Run Code Online (Sandbox Code Playgroud) 我可以访问部署在 WebSphere 中的项目。我只创建.class文件并将它们放在WEB-INF下。
现在,我的一个 Java 类需要一个 JAR。我无权添加 JAR 并重新部署。只需要将同机C盘的JAR添加到项目的类路径中即可;这样它就可以在加载时加载 JAR。
我怎样才能做到这一点?
我使用以下代码从类路径读取文件:
Files.readAllBytes(new ClassPathResource("project.txt").getFile().toPath())
Run Code Online (Sandbox Code Playgroud)
project.txt当我处于战争状态时,这工作得很好src/main/resources。现在我重构了代码并将某些代码移至 JAR 中。这个新 JAR 现在包含src/main/resources/project.txt上面的代码。现在我在读取文件时遇到以下异常:
java.io.FileNotFoundException: class path resource [project.txt]
cannot be resolved to absolute file path because it does
not reside in the file system:
jar:file:/usr/local/tomcat/webapps/ROOT/WEB-INF/lib/viewer-1.0.0-SNAPSHOT.jar!/project.txt
Run Code Online (Sandbox Code Playgroud)
我仍在 Tomcat 容器中执行 WAR。
我怎样才能解决这个问题?
-Xbootclasspath/p:path我正在尝试在 Java 11 中做同样的事情,这些事情可以在 java 9 之前的版本中完成。
作为一个简单的示例,我修改了其中一种valueOf方法java.lang.Integer并使用以下方法编译了该项目:
javac --module-source-path=src/java.base --patch-module java.base=src/java.base -d mods $(find src -name '*.java')
然后我使用以下命令运行了一个简单的示例:
java --patch-module java.base=<pathToMyModifiedJavaBaseClasses> -p lib -m my.moduleA/my.moduleA.Main
这很有效,我看到显示的修改(我从 中所做的简单打印valueOf)。
然而,当我尝试做同样的事情时,java.lang.ClassLoader执行程序时出现以下错误(编译有效):
Error occurred during initialization of boot layer
java.lang.LinkageError: loader 'bootstrap' attempted duplicate class definition for java.lang.invoke.SimpleMethodHandle.
我什至不需要进行更改java.lang.ClassLoader。我的补丁文件夹中该类的绝对存在似乎引发了此错误。(我只想在类的底部添加一个字段)
ClassLoader注意:我只是认为当使用 Eclipse 编译该类时它可以工作。我知道的少数差异之一是 Eclipse 编译器似乎尚未遵循JEP 280。invokedynamic但是字节码中也有指令javac,所以我怀疑这就是问题所在。
java classpath java-platform-module-system java-module java-11
我花了好几个小时试图弄清楚为什么我得到了这个java.lang.NoClassDefFoundError,并且我把原因缩小到了Tomcat的类路径.
我使用下面的代码来查看路径变量的含义:
out.println("Classpath: '" + System.getProperty( "java.class.path" ) + "'" );
out.println("Ext dirs: '" + System.getProperty( "java.ext.dirs" ) + "'" );
out.println("Library path: '" + System.getProperty( "java.library.path" ) + "'" );
out.println("Path separator: '" + System.getProperty( "path.separator" ) + "'" );
Run Code Online (Sandbox Code Playgroud)
输出是:
Classpath: ':/usr/local/tomcat/bin/bootstrap.jar' Ext dirs: '/usr/lib/jvm/java-6-sun-1.6.0.16/jre/lib/ext:/usr/java/packages/lib/ext' Library path: '/usr/lib/jvm/java-6-sun-1.6.0.16/jre/lib/i386/server:/usr/lib/jvm/java-6-sun-1.6.0.16/jre/lib/i386:/usr/lib/jvm/java-6-sun-1.6.0.16/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib' Path separator: ':'
如您所见,Classpath不以"."开头.因为它应该,我相信这就是为什么我的程序找不到我从webapp中的子目录导入的类.
为了查看类路径的设置位置,我做了grep -R bootstrap.jar /usr/local/tomcat/,并且反过来:( CLASSPATH="$CLASSPATH":"$CATALINA_HOME"/bin/bootstrap.jar在文件中/usr/local/tomcat/bin/catalina.sh)
这让我相信由于某些原因,$ CLASSPATH在这里是空的.但是,echo $CLASSPATH成功返回.:/usr/lib/jvm/java-6-sun/bin:/usr/local/tomcat/lib/servlet-api.jar
任何人都可以帮助解决这个问题吗?
编辑:我所有的servlet文件都在WEB-INF/classes/controllers/,我试图加载的库是子目录中的类文件.例如,如果ClassName.class在WEB-INF/classes/controllers/packagename /目录中,我添加package …
在运行maven jetty插件时,我是否应该期望main/resources中的文件位于类路径中?这些应用程序可用于我在码头内运行吗?我是否可以将它们作为类路径资源而不是通过文件系统加载?
使用Eclipse Maven插件在Eclipse中运行junit测试也是同样的问题.
如果此目录不在类路径上,我可以添加它吗?
我有一个代码库,我想生成几个可交付的jar文件,每个文件都要从命令行运行,并访问代码库的某些功能.运行时,一些命令行参数是jar中的其他类,然后由反射创建.它工作得很好,但我必须指定类的非常长的完全限定路径,即使这些类在jar文件中.
我使用ant编译然后jar一系列目录.从最小的示例build.xml文件:
<property name="build" location="build"/>
<property name="jars" location="${build}/jars"/>
<property name="classes" location="${build}/classes"/>
<property name="src" location="src/dom/place/proj"/>
<target name="utility">
<javac
includeantruntime="false"
srcdir="${src}/utility" destdir="${classes}"
classpathref="classpath" />
<jar
destfile="${jars}/utility.jar"
basedir="${classes}"
includes="**/utility/**" />
</target>
<target name="tokenizers" depends="utility">
<javac
includeantruntime="false"
srcdir="${src}/tokenizers"
destdir="${classes}"
classpathref="classpath" />
<jar
destfile="${jars}/tokenizers.jar"
basedir="${classes}"
includes="**/tokenizers/**" />
</target>
Run Code Online (Sandbox Code Playgroud)
后来,我正在创建一个包含所有必需类的jar文件,并将运行一个命令,例如:
<target name="tokenize-file-jar">
<jar destfile="${dist}/TokenizeFile.jar">
<zipgroupfileset dir="${jars}">
<include name="utility.jar"/>
<include name="tokenizers.jar"/>
</zipgroupfileset>
<manifest>
<attribute name="Main-Class" value="dom.place.proj.tokenizers.TokenizeFile"/>
</manifest>
</jar>
</target>
Run Code Online (Sandbox Code Playgroud)
这一切都有效,并查看jar文件,所有类都在那里.
prompt > unzip -l TokenizeFile.jar
Archive: TokenizeFile.jar
Length Date Time Name
-------- ---- ---- ----
0 01-11-12 …Run Code Online (Sandbox Code Playgroud) 我有一个带有多个包的osgi应用程序(在felix中).一个包中有一些常见的属性文件,其余的包只需要使用它们.
我们使用maven和spring osgi,属性文件在resouces中:
<path to bundle>/src/main/resources/
common.properties
engine.properties
...
Run Code Online (Sandbox Code Playgroud)
Maven通常在bundle jar中构建它们,因此它们应该在应用程序类路径中,但Spring无法访问它们,这会失败:
<context:property-placeholder location="classpath:common.properties" />
Run Code Online (Sandbox Code Playgroud)
(试过classpath*:和其他组合)
它是否真的是osgi意识形态的全球问题,没有标准的方法让它运作?只有黑客和解决方法就像是和<osgix:cmProperties...>?
它关注的是因为它使部署更加困难且容易出错:您无法mvn deploy像在普通应用程序中那样在jars中部署属性文件, - 您必须手动将它们复制到每个版本的生产框中.
classpath ×10
java ×9
spring ×2
ant ×1
apache-spark ×1
hive ×1
java-11 ×1
java-module ×1
java-platform-module-system ×1
jetty ×1
log4j2 ×1
maven-2 ×1
osgi ×1
reflection ×1
scala ×1
slf4j ×1
tomcat ×1
websphere ×1