Java安全异常BIRT和Apache POI Hack(Java Security Exception BIRT and Apache POI Hack)
我得到了一个
java.lang.SecurityException: class "org.apache.poi.POIXMLDocument"'s signer information does not match signer information of other classes in the same package
在BIRT核心jar和Apache POI jar之间, 如BIRT错误报告所述。
错误报告中已经说明了这可以通过升级BIRT来修复,但是当我这样做时,我遇到了另一个运行时错误,只能通过降级来解决。 因此,就目前而言,我在这里有点腌渍。 这个评论说我应该能够解压缩apache poi jar,删除安全信息(BIRT清单中没有),然后重新压缩它,我应该好好去,但是当我删除安全信息时,我的代码是使用apache poi不再编译,就好像poi依赖不再存在(是的,它在类路径上)。 此外,我也从我的aspectj weaver抛出异常。
这是META-INF / MANIFEST.MF:
之前(删节,snippit)
Manifest-Version: 1.0 Bundle-ClassPath: . Bundle-Vendor: Eclipse Orbit Bundle-Name: Apache POI Bundle-SymbolicName: org.apache.poi Eclipse-SourceReferences: scm:cvs:pserver:dev.eclipse.org:/cvsroot/too ls:org.eclipse.orbit/org.apache.poi;tag=v201303080712 Export-Package: org.apache.poi,org.apache.poi.common.usermodel,org.apa che.poi.ddf,org.apache.poi.dev,org.apache.poi.hpsf,org.apache.poi.hps f.extractor,org.apache.poi.hpsf.wellknown,org.apache.poi.hssf,org.apa che.poi.hssf.dev,org.apache.poi.hssf.eventmodel,org.apache.poi.hssf.e ventusermodel,org.apache.poi.hssf.eventusermodel.dummyrecord,org.apac he.poi.hssf.extractor,org.apache.poi.hssf.model,org.apache.poi.hssf.r ecord,org.apache.poi.hssf.record.aggregates,org.apache.poi.hssf.recor d.cf,org.apache.poi.hssf.record.chart,org.apache.poi.hssf.record.comm on,org.apache.poi.hssf.record.cont,org.apache.poi.hssf.record.crypto, org.apache.poi.hssf.record.pivottable,org.apache.poi.hssf.usermodel,o rg.apache.poi.hssf.util,org.apache.poi.poifs.common,org.apache.poi.po ifs.crypt,org.apache.poi.poifs.dev,org.apache.poi.poifs.eventfilesyst em,org.apache.poi.poifs.filesystem,org.apache.poi.poifs.nio,org.apach e.poi.poifs.property,org.apache.poi.poifs.storage,org.apache.poi.ss,o rg.apache.poi.ss.extractor,org.apache.poi.ss.format,org.apache.poi.ss .formula,org.apache.poi.ss.formula.atp,org.apache.poi.ss.formula.cons tant,org.apache.poi.ss.formula.eval,org.apache.poi.ss.formula.eval.fo rked,org.apache.poi.ss.formula.function,org.apache.poi.ss.formula.fun ctions,org.apache.poi.ss.formula.ptg,org.apache.poi.ss.formula.udf,or g.apache.poi.ss.usermodel,org.apache.poi.ss.usermodel.charts,org.apac he.poi.ss.util,org.apache.poi.ss.util.cellwalk,org.apache.poi.util Bundle-Version: 3.9.0.v201303080712 Bundle-ManifestVersion: 2 Name: org/apache/poi/ss/formula/functions/AggregateFunction$5.class SHA1-Digest: 5RrBJbQIbv6B9uMzek3j1oKz6M8= Name: org/apache/poi/ss/usermodel/charts/AxisCrosses.class SHA1-Digest: ipQ9+pxjWLkgUu7+oqv0Yehyggw= Name: org/apache/poi/hssf/usermodel/HSSFSheet.class SHA1-Digest: ScBV1zHQgPkl9+/wIKAG4fJQXCo= Name: org/apache/poi/hssf/record/HyperlinkRecord$GUID.class SHA1-Digest: 3kpDbR6WINPRF24HCT7qOrhKnE4= Name: org/apache/poi/poifs/storage/RawDataBlockList.class SHA1-Digest: RHoYWrfErxUXOgVH4A9IDEXcx6c= Name: META-INF/LICENSE SHA1-Digest: skDsOhroUOXZROozPxPxBGVNGv4= Name: org/apache/poi/ss/util/DateFormatConverter.class SHA1-Digest: LKE6cGcKD20qFWR7++gAw1YMZ7s= ... a lot more of this SHA1-Digest stuff
之后(未删节,完整档案):
Manifest-Version: 1.0 Bundle-ClassPath: . Bundle-Vendor: Eclipse Orbit Bundle-Name: Apache POI Bundle-SymbolicName: org.apache.poi Eclipse-SourceReferences: scm:cvs:pserver:dev.eclipse.org:/cvsroot/too ls:org.eclipse.orbit/org.apache.poi;tag=v201303080712 Export-Package: org.apache.poi,org.apache.poi.common.usermodel,org.apa che.poi.ddf,org.apache.poi.dev,org.apache.poi.hpsf,org.apache.poi.hps f.extractor,org.apache.poi.hpsf.wellknown,org.apache.poi.hssf,org.apa che.poi.hssf.dev,org.apache.poi.hssf.eventmodel,org.apache.poi.hssf.e ventusermodel,org.apache.poi.hssf.eventusermodel.dummyrecord,org.apac he.poi.hssf.extractor,org.apache.poi.hssf.model,org.apache.poi.hssf.r ecord,org.apache.poi.hssf.record.aggregates,org.apache.poi.hssf.recor d.cf,org.apache.poi.hssf.record.chart,org.apache.poi.hssf.record.comm on,org.apache.poi.hssf.record.cont,org.apache.poi.hssf.record.crypto, org.apache.poi.hssf.record.pivottable,org.apache.poi.hssf.usermodel,o rg.apache.poi.hssf.util,org.apache.poi.poifs.common,org.apache.poi.po ifs.crypt,org.apache.poi.poifs.dev,org.apache.poi.poifs.eventfilesyst em,org.apache.poi.poifs.filesystem,org.apache.poi.poifs.nio,org.apach e.poi.poifs.property,org.apache.poi.poifs.storage,org.apache.poi.ss,o rg.apache.poi.ss.extractor,org.apache.poi.ss.format,org.apache.poi.ss .formula,org.apache.poi.ss.formula.atp,org.apache.poi.ss.formula.cons tant,org.apache.poi.ss.formula.eval,org.apache.poi.ss.formula.eval.fo rked,org.apache.poi.ss.formula.function,org.apache.poi.ss.formula.fun ctions,org.apache.poi.ss.formula.ptg,org.apache.poi.ss.formula.udf,or g.apache.poi.ss.usermodel,org.apache.poi.ss.usermodel.charts,org.apac he.poi.ss.util,org.apache.poi.ss.util.cellwalk,org.apache.poi.util Bundle-Version: 3.9.0.v201303080712 Bundle-ManifestVersion: 2
如您所见,我删除了所有安全信息。 我一路走错了吗? 这是我的问题的有效解决方案吗?
I'm getting a
java.lang.SecurityException: class "org.apache.poi.POIXMLDocument"'s signer information does not match signer information of other classes in the same package
between the BIRT core jar and an Apache POI jar, as described by this BIRT bug report.
It has been stated in the bug report that this can be fixed by upgrading BIRT, however when I do that I run into another runtime bug which can only be solved by downgrading. Thus, as it stands I am in a little bit of a pickle here. This comment says that I should be able to unzip the apache poi jar, delete the security information (there is none in the BIRT manifest), then rezip it and I should be good to go, however when I delete the security information my code that uses apache poi no longer compiles, its as if the poi dependency no longer exists (yes it is on the classpath). In addition i'm also getting an exception thrown from my aspectj weaver.
Here is the META-INF/MANIFEST.MF:
before (abridged, snippit)
Manifest-Version: 1.0 Bundle-ClassPath: . Bundle-Vendor: Eclipse Orbit Bundle-Name: Apache POI Bundle-SymbolicName: org.apache.poi Eclipse-SourceReferences: scm:cvs:pserver:dev.eclipse.org:/cvsroot/too ls:org.eclipse.orbit/org.apache.poi;tag=v201303080712 Export-Package: org.apache.poi,org.apache.poi.common.usermodel,org.apa che.poi.ddf,org.apache.poi.dev,org.apache.poi.hpsf,org.apache.poi.hps f.extractor,org.apache.poi.hpsf.wellknown,org.apache.poi.hssf,org.apa che.poi.hssf.dev,org.apache.poi.hssf.eventmodel,org.apache.poi.hssf.e ventusermodel,org.apache.poi.hssf.eventusermodel.dummyrecord,org.apac he.poi.hssf.extractor,org.apache.poi.hssf.model,org.apache.poi.hssf.r ecord,org.apache.poi.hssf.record.aggregates,org.apache.poi.hssf.recor d.cf,org.apache.poi.hssf.record.chart,org.apache.poi.hssf.record.comm on,org.apache.poi.hssf.record.cont,org.apache.poi.hssf.record.crypto, org.apache.poi.hssf.record.pivottable,org.apache.poi.hssf.usermodel,o rg.apache.poi.hssf.util,org.apache.poi.poifs.common,org.apache.poi.po ifs.crypt,org.apache.poi.poifs.dev,org.apache.poi.poifs.eventfilesyst em,org.apache.poi.poifs.filesystem,org.apache.poi.poifs.nio,org.apach e.poi.poifs.property,org.apache.poi.poifs.storage,org.apache.poi.ss,o rg.apache.poi.ss.extractor,org.apache.poi.ss.format,org.apache.poi.ss .formula,org.apache.poi.ss.formula.atp,org.apache.poi.ss.formula.cons tant,org.apache.poi.ss.formula.eval,org.apache.poi.ss.formula.eval.fo rked,org.apache.poi.ss.formula.function,org.apache.poi.ss.formula.fun ctions,org.apache.poi.ss.formula.ptg,org.apache.poi.ss.formula.udf,or g.apache.poi.ss.usermodel,org.apache.poi.ss.usermodel.charts,org.apac he.poi.ss.util,org.apache.poi.ss.util.cellwalk,org.apache.poi.util Bundle-Version: 3.9.0.v201303080712 Bundle-ManifestVersion: 2 Name: org/apache/poi/ss/formula/functions/AggregateFunction$5.class SHA1-Digest: 5RrBJbQIbv6B9uMzek3j1oKz6M8= Name: org/apache/poi/ss/usermodel/charts/AxisCrosses.class SHA1-Digest: ipQ9+pxjWLkgUu7+oqv0Yehyggw= Name: org/apache/poi/hssf/usermodel/HSSFSheet.class SHA1-Digest: ScBV1zHQgPkl9+/wIKAG4fJQXCo= Name: org/apache/poi/hssf/record/HyperlinkRecord$GUID.class SHA1-Digest: 3kpDbR6WINPRF24HCT7qOrhKnE4= Name: org/apache/poi/poifs/storage/RawDataBlockList.class SHA1-Digest: RHoYWrfErxUXOgVH4A9IDEXcx6c= Name: META-INF/LICENSE SHA1-Digest: skDsOhroUOXZROozPxPxBGVNGv4= Name: org/apache/poi/ss/util/DateFormatConverter.class SHA1-Digest: LKE6cGcKD20qFWR7++gAw1YMZ7s= ... a lot more of this SHA1-Digest stuff
After (unabridged, full file):
Manifest-Version: 1.0 Bundle-ClassPath: . Bundle-Vendor: Eclipse Orbit Bundle-Name: Apache POI Bundle-SymbolicName: org.apache.poi Eclipse-SourceReferences: scm:cvs:pserver:dev.eclipse.org:/cvsroot/too ls:org.eclipse.orbit/org.apache.poi;tag=v201303080712 Export-Package: org.apache.poi,org.apache.poi.common.usermodel,org.apa che.poi.ddf,org.apache.poi.dev,org.apache.poi.hpsf,org.apache.poi.hps f.extractor,org.apache.poi.hpsf.wellknown,org.apache.poi.hssf,org.apa che.poi.hssf.dev,org.apache.poi.hssf.eventmodel,org.apache.poi.hssf.e ventusermodel,org.apache.poi.hssf.eventusermodel.dummyrecord,org.apac he.poi.hssf.extractor,org.apache.poi.hssf.model,org.apache.poi.hssf.r ecord,org.apache.poi.hssf.record.aggregates,org.apache.poi.hssf.recor d.cf,org.apache.poi.hssf.record.chart,org.apache.poi.hssf.record.comm on,org.apache.poi.hssf.record.cont,org.apache.poi.hssf.record.crypto, org.apache.poi.hssf.record.pivottable,org.apache.poi.hssf.usermodel,o rg.apache.poi.hssf.util,org.apache.poi.poifs.common,org.apache.poi.po ifs.crypt,org.apache.poi.poifs.dev,org.apache.poi.poifs.eventfilesyst em,org.apache.poi.poifs.filesystem,org.apache.poi.poifs.nio,org.apach e.poi.poifs.property,org.apache.poi.poifs.storage,org.apache.poi.ss,o rg.apache.poi.ss.extractor,org.apache.poi.ss.format,org.apache.poi.ss .formula,org.apache.poi.ss.formula.atp,org.apache.poi.ss.formula.cons tant,org.apache.poi.ss.formula.eval,org.apache.poi.ss.formula.eval.fo rked,org.apache.poi.ss.formula.function,org.apache.poi.ss.formula.fun ctions,org.apache.poi.ss.formula.ptg,org.apache.poi.ss.formula.udf,or g.apache.poi.ss.usermodel,org.apache.poi.ss.usermodel.charts,org.apac he.poi.ss.util,org.apache.poi.ss.util.cellwalk,org.apache.poi.util Bundle-Version: 3.9.0.v201303080712 Bundle-ManifestVersion: 2
As you can see, I deleted all the security information. Did I do something wrong along the way? Is this a valid solution for my problem?
原文:https://stackoverflow.com/questions/33988136
最满意答案
修改迭代器来执行此遍历会很奇怪。 显而易见的事情就是根据需要编写“算法”:
public static <T> void eachExceptLast(List<? extends T> list, Operation<T> op) { Iterator<T> iter = list.iterator(); if (!iter.hasNext()) { return; } T item = iter.next(); while (iter.hasNext()) { op.run(item); item = iter.next(); } }
(或者使用假定
RandomAccess
列表的索引。)但是,有一个更好的方法来做到这一点。
list.subList(0, list.size()-1)
(对于非空列表)将返回原始列表的视图,而不是最后一个元素。 它不会复制,您甚至可以使用Iterator.remove
。It would be odd to modify the iterator to perform this traversal. The obvious thing to do is to write the "algorithm" as you want it:
public static <T> void eachExceptLast(List<? extends T> list, Operation<T> op) { Iterator<T> iter = list.iterator(); if (!iter.hasNext()) { return; } T item = iter.next(); while (iter.hasNext()) { op.run(item); item = iter.next(); } }
(Or use an index assuming a
RandomAccess
list.)However, there's a much better way of doing this.
list.subList(0, list.size()-1)
(for a non-empty list) will return a view of the original list less the last element. It doesn't do a copy, and you can even useIterator.remove
.
相关问答
更多-
Iterator 和arrayList的关系?[2024-01-05]
ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。 size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。 每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法 并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以 ... -
如何限制迭代器只返回子类的实例?(How can I restrict an iterator to return only instances of a subclass?)[2024-02-27]
我建议将EntityCollection通用。 public class EntityCollectionimplements Iterable { protected List entities; public EntityCollection() { entities = new ArrayList (); } public Iterator iterator() { ret ... -
我这样做是否正确,只要通过Arraylist进行迭代? 否:通过在每次迭代中调用iterator两次,你总是得到新的迭代器。 写这个循环的最简单的方法是使用for-each结构: for (String s : arrayList) if (s.equals(value)) // ... 至于 java.lang.ArrayIndexOutOfBoundsException: -1 你刚刚尝试从数组中获取元素号-1 。 计数从零开始。 Am I doing that right, ...
-
更好地使用图书馆,如番石榴 : import com.google.common.collect.Lists; Iterator
myIterator = ... //some iterator List myList = Lists.newArrayList(myIterator); 另一个番石榴的例子: ImmutableList.copyOf(myIterator); 或Apache Commons Collections : import org.apach ... -
调用list.iterator()每次都会创建一个新的迭代器。 Iterator
iter = list.iterator()将解决您的问题 只需重复使用它。 例如: SimpleList list = new SimpleList (); list.append("aylmao"); list.append("1aylmao"); list.append("2aylmao"); list.append("3aylmao"); ... -
使用地图结构而不是嵌套List解决 State find(State state) { LinkedList
list = new LinkedList<>(); list.push(null); State temp = null; State ptr = startState; if(ptr.stateName.equals(state.stateName)) temp = ptr; while(ptr != nu ... -
使用Iterator从ArrayList添加,删除和打印(Adding, removing and printing from ArrayList with Iterator)[2023-07-04]
我更新了订单代码 您需要从列表中重新启动迭代器,因为列表将被修改 用于检查列表中已存在的值是否被修改的逻辑。 import java.util.ArrayList; import java.util.Iterator; public class Orders { ArrayList list = new ArrayList(); Iterator it = null; public void addOrder(String ... -
为什么不 ? school.remove(studentToCompare); 使用List remove(Object)方法。 从列表中删除第一次出现的指定元素(如果存在)(可选操作)。 而且 如果此列表包含指定的元素(或者等价地,如果此列表因调用而更改),则返回true。 Why not ? school.remove(studentToCompare); Use List remove(Object) method. Removes the first occurrence of the spec ...
-
修改迭代器来执行此遍历会很奇怪。 显而易见的事情就是根据需要编写“算法”: public static
void eachExceptLast(List extends T> list, Operation op) { Iterator iter = list.iterator(); if (!iter.hasNext()) { return; } T item = iter.next(); while (iter. ... -
对象本身仍然是一个subclass ,但是当你从集合中获取它们时,它只知道superclass所以它无法告诉你哪个是哪个,它必须选择公分母。 如果您确切知道特定索引包含Subclass类型的对象,则可以将其Subclass : Subclass myObject = (Subclass) list.get(0); System.out.println(myObject.getQuantity()); 它应该工作。 更安全的方法需要测试对象是否真的如你所想: SuperClass myObject = li ...