Springプロジェクトのパッケージング問題の調査を1回記録する

7533 ワード

スプリングプロジェクトは、jarパッケージにして実行され、ネットワークがあるときは正常ですが、ネットワークがないとエラーが発生します.具体的にはどうなっていますか.この文章は今回の問題の調査の経緯を記録する.
背景紹介
グラフィック化されたインタフェースで、ローカルデータベースを持っていて、ネットワーク環境なしで実行できることを要求しています.私が友达のJavaで書いたグラフィック化されたインタフェースは、あまり美しくありませんが、Javaに詳しいほうがいいです.
プロジェクトはideaの「Build Artifacts」パッケージを使用しており、パッケージ化後は正常に動作し、インタフェースもデータベースアクセスも正常で、最初は何度かエラーを報告したが、その後は現れず、原因も見つからず、先にそうした.
後で他の人に送って、完全に開けられなくて、前の新聞の間違いと同じように、新聞の間違いの原因を明らかにしなければならないようです.
問題の調査
誤報内容
まず、エラーメッセージを貼ります.
org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: 
Line 8 in XML document from class path resource [spring.xml] is invalid; 
nested exception is org.xml.sax.SAXParseException; 
lineNumber: 8; columnNumber: 76; 
cvc-elt.1:       'beans'    。

Spring.xmlコードは次のように切り取られます.




問題の再現
私も前にこの新聞の間違いに遭遇したことがあるので、問題を再現して、調べやすいと思っています.
私は直接仮想マシンで実行します.インストールを上書きしてもアンインストールしても再インストールしても大丈夫です.環境の問題が原因かもしれないと思います.新しい仮想マシンを着てみたいと思っています.
新しいシステムがインストールされた後、実行すると、やはりクラッシュして、情報を間違えたようです.問題を再現することができて、問題を解決するために良いスタートを切ったと言える.
問題の調査
原因を見つける
キーワードcvc-elt.1: 'beans' によって検索が開始され、検索された結果は基本的に以下の内容である.
プロファイルヘッダ構成のxsdバージョン情報が正しくなく、解析時にエラーが発生しました.Springヘッダxsdまたはdtdチェックファイルの検索は2つのステップに分かれており、最初にローカルjarパッケージから探し、見つけたらローカルjarパッケージでチェックし(spring-beans.jarまたはspring-context.jarのMETA-INFの下のspring.schemasファイルでxsdファイルの位置の定義を見つけることができます)、見つけなければ2番目のステップで検索し、ネットワークからファイルをダウンロードして検証し、システムがネットワークを切断したりダウンロードできない場合は、上記の例外が放出されます.
この考え方に従って、友达も私に注意して、仮想机のシステムがネットに接続されているかどうかを见て、私は见て、やはりネットに接続していないで、急いでネットテストして正常に运行することができることを発见して、问题の原因は探し当てました.
再び戸惑う
問題の原因を見つけて、すぐに解決できるようになったが、事実は私が思ったほどではない.
ネット上の解決策は次のとおりです.
アプリケーションContext.xmlのxsdファイル定義のバージョンをspring jarパッケージで定義したxsdのバージョンに変更します.バージョン定義が高すぎてローカルで見つからない場合は、ネットワークからダウンロードするしかありません.
しかし、spring-beans.jarMETA-INFの下のspring.schemasのファイルを見ると、バージョン番号にかかわらず、最後に指しているのは1つであることがわかります.
一部のコードを切り取ったのは次のとおりです.
http\://www.springframework.org/schema/beans/spring-beans-2.0.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-2.5.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-3.0.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-3.1.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-3.2.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-4.0.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-4.1.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-4.2.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans-4.3.xsd=org/springframework/beans/factory/xml/spring-beans.xsd
http\://www.springframework.org/schema/beans/spring-beans.xsd=org/springframework/beans/factory/xml/spring-beans.xsd

その後、「spring 5のSAXParseException:cvc-elt.1:要素「beans」の声明が見つからない」という文章を見つけ、Spring 5以降はバージョン番号を書く必要はないと言った.
それは私が見た状況と同じで、確かに各バージョン番号が同じことを指しています.バージョン番号の問題ではないようですが、それはいったいどういうことですか.
一波三折xsdのバージョンが間違っていない以上、問題はどこにあるのでしょうか.
検索を続けた後、この文章を見た.「システムが起動したとき、springプロファイルの解析に失敗しました.」cvc-elt.1:要素「beans」の声明「異常」が見つかりませんでした.
パッケージ化後、spring.schemasはjarパッケージのMETA-INFディレクトリの下にありますが、spring.schemasにはspring-beans.xsdはありません.問題はここにあるようです.著者の方法に倣って、上記のspring-beans.jarMETA-INFspring.schemasのうち、spring-beans.xsdに関する部分を圧縮パッケージのspring.schemasに追加しました.
再パッケージした後もエラーが発生しましたが、エラーは以前のエラーではありません.私の主関数クラスが見つからないということです.本当に頭がつかめません.状況が似ていますね.どうして私の使いにくいですか.
おおらかである
やはり上の操作で、私は友达に试してもらいました.彼はテストしてから意外にも使いやすいです.
私は彼にどのように操作するかを聞いて、彼は私の操作と同じだと言って、ただhttps部分のも加えただけで、私はすべきではないと思って、httpsspring-beans.xsdも引用していないで、この問題ではないでしょう.
私は彼の操作に従って、私のパソコンの上で再び梱包して、やはり使いにくいことを発見します;私はまた彼の私にくれた書類を私の打ったかばんの中に置き換えて、やはり使いにくいです.本当に蒙って、操作は同じで、どうして私の使いにくいですか.
それから友达は私に改正したかばんを彼に送ってもらうと言って、彼は见た后に私の打ったかばんの大きさが异なっていることを発见して、正常は14 MBであるべきで、しかし私のかばんは500 KBで、私はまたもう一度操作して、私がファイルを交换したことを発见して、全体のjarかばんの大きさは小さくなって、もとは私の圧縮のかばんのソフトウェアが问题があるのです.
友達のパソコンはWindowsで、直接WinRARでjarパッケージを開けて、それからファイルを置き換えます;私のはMacで、eZipソフトウェアでjarパッケージを開けて、それからファイルを置き換えます.最後に、私は仮想機を使って友達の操作テストに従ってokを発見しました.
圧縮ソフトの問題だと誰が予想できるだろうか.しかし、ソフトウェアのせいにするわけにはいかない.結局、人は解凍ソフトで、jarファイルを専門に処理しているわけではない.
完璧な解決
問題の原因が見つかり、解決策もありましたが、解決策が不十分で、いつもかばんを打つたびに手動でファイルを置き換えることはできませんよね?
私たちが直面できる問題なら、きっと他の人も遭遇すると思います.私はキーワードspring.schemas beans を使って検索して、完璧な解決策を見つけました.「springはjar問題にパッケージされています」.
問題の根本的な原因は、springの複数のjarパッケージにspring.schemasが含まれているため、「Build Artifacts」と「Maven」のデフォルトパッケージは、初めて出会ったschemasファイルをjarパッケージに打ち込むだけです.
解決策はmaven shadeでパッケージ化され、具体的なコードは以下の通りです.

    org.apache.maven.plugins
    maven-shade-plugin
    3.2.2
    
        
            package
            
                shade
            
            
                
                    
                        xxx.xxx.xxx.App
                    
                    
                        META-INF/spring.handlers
                    
                    
                        META-INF/spring.schemas
                    
                    
                        META-INF/spring.tooling
                    
                
            
        
    


プロジェクトpom.xmlノードにコードを配置し、コードのノードにメイン関数の完全なディレクトリを書きます.
に感銘を与える
問題が解決し、そこからもいくつかの感じが得られました.
  • 問題が発生したら、できるだけ早く解決しなければなりません.問題はあなたを見逃さないからです.
  • Macでの圧縮ソフトはWindowsでの使い勝手はしばらくありません.
  • ネット上の答えは本当に千編一律で、一人の答えが多くの人にコピーされ、問題がはっきりしていない.
  • が検索した千編一律の答えは、もう時代遅れかもしれないが、自分の状況には向いていない.
  • 自分で出会った問題は、ほとんどが他の人が出会ったもので、解決できるもので、辛抱強く検索すると解決策が見つかります.
  • 訪問を歓迎する個人ブログ:墓を掘る人のシャベル