2017-01-18 98 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