2017-01-18 104 views
7

我正在为WebLogic服务器制作一些WebFilters,并且已经启动并运行了所有内容。将jardesc内容转换为jar命令

问题是我如何将过滤器打包成jar文件。如果我使用下面的jardesc文件并从Eclipse创建jar文件,那么一切正常,WebLogic在加载webfilter类时没有问题。但只要我尝试使用jar.exe手动创建jar文件,我在WebLogic中加载webcontainer时遇到了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文件,这似乎是等同于所产生的一个在Eclipse中使用jardesc文件,除了看起来像jar文件根目录下的META-INF文件夹的某种符号链接。

工作的jar文件的内容 Working jar-file

内容非工作的jar文件的 enter image description here

谁能解释一下执行jar.exe的正确命令,给定jardesc文件?

或者

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

使用JDK-1.8.0_111 Output of jar-command

+0

您正在使用哪个版本的Java?我只是用jdk-1.8.0_92 64位试过你的jar命令,没有得到不祥的META-INF条目。不过,我真的建议不要依赖eclipse或任何手工制作的命令行来打包你的过滤器。你应该尝试一下。这可能听起来像是一种矫枉过正,但只要你不想要一些非常特殊的东西,开始其实很容易。如果这是一个选项,我可以制作一些基本的gradle文件来完成打包... – dpr

+0

你可以添加jar-command的命令行输出吗? – dpr

+0

用java版本更新了问题并从jar-command输出。 – Falle1234

回答

0

我不认为你的命令行是正确的,即使使用的jar命令运行的输出更新。根据jar输出

用法 如:罐子{ctxui} [vfmn0PMe] [JAR文件] [清单文件] [入口点] [-C DIR]文件...

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

这是期望得到[JAR文件]名后[清单文件]和[入口点。

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

+0

'manifest-file'是可选的,并且只有在指定'm'(不生成默认清单)开关时才需要。 – dpr

+1

结果与原始命令完全相同。清单文件和入口文件都只在使用相应的开关时才使用。 – Falle1234

1

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

但是我建议不要依赖eclipse的输出,如果你想创建一个jar文件,你要分布在某个地方。我个人很喜欢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文件正在使用:

在你的项目有以下内容的根目录只需创建一个build.gradle文件所需的gradle版本。

运行

%PROJECT_ROOT%/gradlew.bat build 

,并找到下

%PROJECT_ROOT%/build/libs 

的jar文件不过,您将需要遵循一些约定,并放置了一个名为src/main/java此文件夹的工作OUT-在你的Java源代码的即装即用。或者按照this documentation设置不同的源文件夹。

+0

不知道这是我寻找的答案,但它是我迄今为止最好的选择,并且你投入了相当多的时间来帮助我。 – Falle1234