- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在将一个 webapp 从 Tomcat 7 移植到另一个使用 Tomcat 7 但使用 Java 8 的服务器。
Tomcat 启动成功,但在日志 catalina.out
我得到:
org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 15
at org.apache.tomcat.util.bcel.classfile.Constant.readConstant(Constant.java:131)
at org.apache.tomcat.util.bcel.classfile.ConstantPool.<init>(ConstantPool.java:60)
at org.apache.tomcat.util.bcel.classfile.ClassParser.readConstantPool(ClassParser.java:209)
at org.apache.tomcat.util.bcel.classfile.ClassParser.parse(ClassParser.java:119)
at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2049)
at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1931)
at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1899)
at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1885)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1281)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:855)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:346)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5172)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:899)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:875)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:618)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1100)
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1618)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
可能是什么问题?
最佳答案
“官方答案”是 Tomcat 7 在 Java 8 上运行,请参阅 http://tomcat.apache.org/whichversion.html (“Java 版本 6 及更高版本”)。
但是,如果启用注释扫描(web.xml 中的 metadata-complete="true"),则由于 BCEL 存在一些问题(无法处理新的 Java 8 字节码)。你会得到类似的异常(至少在 Tomcat 7.0.28 中):
SEVERE: Unable to process Jar entry [jdk/nashorn/internal/objects/NativeString.class] from Jar [jar:file:/usr/lib/jvm/jdk1.8.0_5/jre/lib/ext/nashorn.jar!/] for annotations
org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 15
at org.apache.tomcat.util.bcel.classfile.Constant.readConstant(Constant.java:131)
如果不使用注解扫描,一切正常,从 7.0.53 版开始(更新的编译器提供更好的 Java 8 支持)。
(2014 年 10 月 17 日更新)如果您的正在使用注释扫描并且您自己的代码不是基于 Java 8,另一种解决方案是在 /etc/tomcat7/catalina.properties 中添加以下行
(在“ant-launcher.jar”之后添加的文本,因此是属性 tomcat.util.scan.DefaultJarScanner.jarsToSkip
的一部分):
junit.jar,junit-*.jar,ant-launcher.jar,\
jfxrt.jar,nashorn.jar
在 Debian 7.6 上使用 Tomcat 7.0.28 和 Oracle JDK 8_25 测试。
关于java - org.apache.tomcat.util.bcel.classfile.ClassFormatException : Invalid byte tag in constant pool: 15,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23541532/
我尝试使用 BCEL 将回调插入到 Java 方法中,但回调从未被调用。这些程序运行起来就好像根本没有检测过一样。 我所做的精简版本: package com.github.worldsender;
嗨,我正在使用 bcel 库来读取字节码。我需要提取变量名称。 知道怎么做吗? 最佳答案 请注意,在类文件级别不存在方法局部变量名称:在 btyecode 级别,它们只是通过局部变量编号引用。所以如果
我正在尝试通过在特定指令之前插入调用来修改方法。看来我的检测会产生不同的堆栈映射表,该表无法由 bcel 包本身自动生成。因此,我的检测类文件包含旧的堆栈映射表,这会导致 jvm 错误。我尝试过使用M
例如,我想使用 BCEL 重置静态字段 private static final int myValue = 1; 到myValue = 2。使用其他字节码库(例如 ASM)是不可能的。 最佳答案 我
我是操作 Java 字节码的 BCEL 新手。我需要使用 BCEL 将新方法插入 .class 文件中的特定行。结果应该是一个新的 .class 文件,其中包含具有新插入方法的类。 我在网上搜索了很多
如何使用bcel classparaser获取类名、元素名和方法名?我已经找到了一种获取类名的方法,但是元素和方法名称给了我一些错误。任何人都可以帮助我吗?这是我的代码(有一些错误,并且未完成): i
我正在尝试使用 BCEL 更改我的测试类的主要方法。我只想添加 System.out.println("这是 BCEL 在运行时添加的")到 main() 的开头。尽管我没有收到异常并且Instruc
在 BCEL 中,我们可以将原始类型压入操作数栈。但是现在我想知道是否可以在 BCEL 中将自定义类型对象推送到堆栈上? 我正在提供一些代码,以便它可以解释问题上下文 class Automo
我正在与 BCEL 合作,尝试将 System.out.println() 调用添加到每个方法的第一行(init 和 clinit 方法除外),以查看调用哪些方法以及何时调用 这是我的代码 atm(带
这个社区中有没有使用过 BCEL 的专家,可以指导我使用 BCEL 调用方法 就像我们使用 java 反射一样。 注意:为了支持您的答案,任何类型的书籍或网络引用都将成为帮助的重要来源。 现在我看到了
我在 在 BCEL 中将整数压入堆栈 时遇到问题。我有一个方法 _square 的 someClass 即“mathClass” ilist = new InstructionList()
我有 public class SecondClass{ MainClass main; public SecondClass(MainClass main){
我正在尝试使用以下代码读取类注释: JavaClass jclas = new ClassParser("src\\test\\org\\poc\\TargetHello.class").parse(
Java 库(在我的例子中为 bcel)何时修改其他代码? 这种情况会在类加载器的引导进程加载相关类之前还是之后发生? 最佳答案 BCEL 在应用程序启动后将类作为文件加载,一旦您有了JavaClas
我使用此代码来获取 Java 类注释: JavaClass jclas = new ClassParser("src\\test\\org\\poc\\TestClass.class").parse(
我想更改使用 BCEL 的方法。但我不知道如何更新异常表。这是简化的代码: ConstantPoolGen poolGen = classGen.getConstantPool(); Instruct
我正在尝试确定 BCEL 库中给定 InvokeInstruction 的被调用者的 MethodGen。问题是我不知道如何使用 InvokeInstruction 来访问它尝试调用的 MethodG
我如何在 BCEL 中检查这一点.. 假设java中的字节码是 newarray 10 (int) 我已经为访客完成了此操作 instruction instanceof NEWARRAY publi
背景:我正在注入(inject) Minecraft 启动器来获取小程序(我已经完成了),但现在我希望通过我的类加载器加载 Minecraft 的文件。我找到了GameUpdater.java(Min
我一生都在尝试让 FindBugs (2.0.1) 作为我的命令行 Ant 构建的一部分运行。我下载了 FindBugs JAR 并将其解压缩到/home/myuser/java/repo/umd/f
我是一名优秀的程序员,十分优秀!