【问题标题】:Translate jardesc content into jar-command将 jardesc 内容翻译成 jar-command
【发布时间】:2017-01-18 08:09:09
【问题描述】:

我正在为我们的 WebLogic 服务器制作一些 WebFilters,并且一切都已启动并运行。

问题是我如何将过滤器打包成 jar 文件。如果我使用以下 jardesc 文件并从 Eclipse 创建 jar 文件,一切正常,WebLogic 加载 webfilter 类没有问题。但是,当我尝试仅使用 jar.exe 手动创建 jar 文件时,我在 WebLogic 中加载 Web 容器时会遇到 ClassNotFoundExceptions。

工作 jardesc 文件:

<?xml version="1.0" encoding="WINDOWS-1252" standalone="no"?>
<jardesc>
    <jar path="C:/Workspace/Java/Jars/jars/corsfilter.jar"/>
    <options buildIfNeeded="true" compress="true" descriptionLocation="/CorsFilter/corsfilter.jardesc" exportErrors="false" exportWarnings="true" includeDirectoryEntries="false" overwrite="false" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
    <storedRefactorings deprecationInfo="true" structuralOnly="false"/>
    <selectedProjects/>
    <manifest generateManifest="true" manifestLocation="" manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="true">
        <sealing sealJar="false">
            <packagesToSeal/>
            <packagesToUnSeal/>
        </sealing>
    </manifest>
    <selectedElements exportClassFiles="true" exportJavaFiles="false" exportOutputFolder="false">
        <file path="/CorsFilter/.project"/>
        <file path="/CorsFilter/.classpath"/>
        <javaElement handleIdentifier="=CorsFilter/src"/>
    </selectedElements>
</jardesc>

当前 jar 命令:

jar -cvf corsfilter.jar .project .classpath -C .\bin dk\akait\filters\cors\CorsFilter.class

jar 命令创建一个 jar 文件,它似乎与在 Eclipse 中使用 jardesc 文件生成的相同,除了看起来像是指向 META-INF 文件夹根目录中的某种符号链接jar 文件。

工作 jar 文件的内容:

非工作 jar 文件的内容

在给定 jardesc 文件的情况下,谁能解释执行 jar.exe 的正确命令是什么?

或者

谁能解释不工作的 jar 文件中的 META-INF 文件是什么?

更新了使用 jdk-1.8.0_111 运行的 jar-command 的输出

【问题讨论】:

  • 您使用的是哪个版本的 Java?我刚刚用 jdk-1.8.0_92 64bit 尝试了你的 jar 命令,但没有得到不祥的 META-INF 条目。但是,我真的建议不要依赖 eclipse 或任何手动制作的命令行来打包过滤器。你应该试试 gradle。这听起来可能有点矫枉过正,但只要你不想要一些非常特别的东西,它实际上很容易上手。如果这是一个选项,我可以制作一些基本的 gradle 文件来进行打包......
  • 您能否也添加 jar 命令的命令行输出?
  • 用 java 版本和 jar-command 的输出更新了问题。
  • 这有点奇怪。我尝试使用相同的 Java 版本进行复制,但没有得到这个空的 META-INF 条目。您使用什么工具来检查生成的 jar 文件?那么 gradle 选项呢?
  • 我将在今天晚些时候尝试 gradle,是的,META-INF 条目看起来确实很奇怪。可能需要研究 zip 文件的结构,看看它是否是一个红色heering。

标签: java eclipse jar


【解决方案1】:

正如 cmets 中已经提到的。我认为这更像是 WinRar 的问题,就像实际创建的 jar 文件一样。可能 eclipse 内部没有使用 jar 命令来根据 jardesc 描述创建 jar 文件。并且 jar 文件的内部结构有所不同。

但是,如果您想创建要分发到某处的 jar 文件,我建议不要依赖 eclipse 输出。我个人非常喜欢 gradle,而且非常好用。

只需在项目根目录中创建一个build.gradle 文件,内容如下:

apply plugin: 'java'

// this is only needed, if you want to include the single file only
// by default all compiled files will be added to the output jar
jar {
  include "dk/akait/filters/cors/CorsFilter.class"
}

task wrapper(type: Wrapper) {
  gradleVersion = '3.3'
}

运行

%PATH_TO_YOUR_GRADLE_BINARIES%/gradle wrapper

这将生成一个本地包装 bat 文件,用于确保您使用的是所需的 gradle 版本。

运行

%PROJECT_ROOT%/gradlew.bat build

并在

下找到 jar 文件
%PROJECT_ROOT%/build/libs

但是,您需要遵循一些约定并将您的 java 源代码放在一个名为 src/main/java 的文件夹下,以便开箱即用。或关注this documentation 设置不同的源文件夹。

【讨论】:

  • 不确定这是否是我一直在寻找的答案,但这是迄今为止我最好的选择,而且您花费了大量时间来帮助我。
【解决方案2】:

我认为您的命令行甚至都不正确。 根据jar输出

用法:jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C 目录] 文件...

还有http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jar.html

在 [jar-file] 名称之后应该是 [manifest-file] 和 [entry-point]。

试试 jar -cvf corsfilter.jar -C . .project .classpath -C .\bin dk\akait\filters\cors\CorsFilter.class

【讨论】:

  • manifest-file 是可选的,只有在指定了m(不生成默认清单)开关时才需要。
  • 结果和原来的命令一模一样。 manifest 和 entryfile 都只在使用它们对应的开关时才使用。
猜你喜欢
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
  • 2012-10-13
相关资源
最近更新 更多