我很确定我要问的是不可能的,但我在任何地方都找不到对这个问题的明确否定,所以它是这样的:
考虑以下工作示例:
public class TableViewerSorter {
private static final String DATA_COMPARATOR = "comparator";
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
final TableViewer viewer = new TableViewer(shell, SWT.BORDER);
Table table = viewer.getTable();
table.setHeaderVisible(true);
viewer.setContentProvider(ArrayContentProvider.getInstance());
viewer.setSorter(new ViewerSorter() {
@Override
public int compare(Viewer v, Object e1, Object e2) {
TableColumn sortColumn = table.getSortColumn();
Comparator comparator = sortColumn == null ? null : (Comparator) sortColumn.getData(DATA_COMPARATOR);
if (comparator != null && table.getSortDirection() == SWT.UP) …Run Code Online (Sandbox Code Playgroud) 我有(可能很常见)用例,我想在共享驱动器上创建一个文件夹:
public static void main(final String[] args) throws IOException {
final Path path = new File("H:\\test-folder").toPath();
Files.createDirectories(path);
}
Run Code Online (Sandbox Code Playgroud)
我得到以下异常:
Exception in thread "main" java.nio.file.FileSystemException: H:\test-folder: Unable to determine if root directory exists
at java.nio.file.Files.createDirectories(Unknown Source)
at org.acme.project.Main.main(Main.java:15)
Run Code Online (Sandbox Code Playgroud)
(这里奇怪的部分是谷歌几乎不知道这个例外.)
这个问题似乎完全是Eclipse的错,因为上面的代码完全可以从命令行运行.但是因为我在Eclipse插件中需要它,所以这些信息与我完全无关.我只是需要它才能工作.
那么在网络驱动器上创建文件夹需要做些什么呢?
我在标签中有一个带有此插件定义的父pom.xmlpluginManagement:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<id>default-bundle</id>
<phase>package</phase>
<goals>
<goal>bundle</goal>
</goals>
</execution>
<execution>
<id>create-source-manifest</id>
<phase>prepare-package</phase>
<goals>
<goal>manifest</goal>
</goals>
</execution>
</executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)
然后,我有实际项目的pom.xml尝试添加执行:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
</plugin>
Run Code Online (Sandbox Code Playgroud)
它导致错误:找到重复的捆绑软件执行。请删除您pom.xml中所有显式定义的包执行。
但是,如果我plugin在Eclipse中删除此标记并再次添加它,该错误将消失。
这是Eclipse M2E问题吗?还是这是一个实际的Maven问题?如果是这样,我该如何解决?我显然不能删除上面的处决。
我可以添加以下内容:
<executions>
<execution><id>default-bundle</id></execution>
<execution><id>create-source-manifest</id></execution>
</executions>
Run Code Online (Sandbox Code Playgroud)
但这对于“执行父pom中定义的所有内容”非常冗长,而且如果我想添加另一次执行,则新的执行不会被执行。
注意:请注意,它在M2E 1.12的Eclipse 2019-06中仍然被打破(我写这个问题时不知道我一年多以前拥有哪个Eclipse)。
序言:我见过这个问题,但它显然是关于旧版本的 POI,从那时起 Apache 就违背了每个 Java 标准。
问题:我的目标是让 POI 与 OSGi 一起工作。到目前为止,我很确定这是不可能的,但也许你们中的一个人有一个好主意。到目前为止我尝试过的:
1) 捆绑 JAR
最简单的方法是将捆绑信息直接添加到 POI jars(另一个答案有关于如何做到这一点的详细信息)。这是行不通的,因为 JAR 导出相同的包,例如poi-3.17.jar和poi-ooxml-3.17.jar都导出org.apache.poi,这在 OSGi 中是不允许的(在标准 Java 中,最好的做法是也有单独的包)。
2)使用预先打包好的插件
我发现org.apache.servicemix.bundles.poi,它是由不了解 OSGi 工作原理的人创建的(也许是 Apache 人?)。它包含任何 JAR 中都不存在的不稳定依赖项,尤其是导入包org.junit让我担心。
我无法让它工作,因为并非所有必要的导入都是捆绑包。而且由于捆绑是如此明显破损,我很快就放弃了。
3) 使用带有 lib 文件夹的插件
很难找到正确的导入和导出包。最终这失败了,因为 POI JAR 导出标准包(如javax.xmlfrom xmlbeans)。
4) 将源文件复制到插件
这大概是我的最爱。当您将源代码复制到它们自己的插件中时,您会遇到编译错误。JAR poi-ooxml-3.17.jar需要一个名为org.etsi.uri.x01903.v13.SignaturePolicyIdType. 该类包含在poi-ooxml-schemas-3.17.jar 中,但令人不安的事实是它的名称是SignaturePolicyIdentifierType.
5)询问阿帕奇
有个问题“POI可以和OSGI一起使用吗?” 在常见问题解答中:
从 POI 3.16 …