1

質問のタイトルが正しいかどうかわかりませんが、質問を読んでください。

私は仕事のほとんどの期間 (11 年近く) C/C++ に取り組んできました。C/C++ ソース/ヘッダー ファイルのみがあり、すべての依存関係は Makefile によって管理されていました。物事はシンプルで扱いやすいものでした。

過去 1.5 年間、私は Java ドメインに移行しました。そして、何か新しいものを扱う上で最も難しい側面が依存関係マネージャーであることに、私は非常に苛立ちを覚えます。例: maven、leiningen、builder、sbt など。

オープンソースの世界から何か新しいものをダウンロードするときはいつでも、コンパイル、ビルド、実行環境をセットアップするだけでかなりの時間が費やされます。私がEclipseを使用しているときもそうです。ダウンロードするソフトウェアと一緒にすべての依存関係を配置できないのはなぜですか?? maven、leiningen などのツールが、依存関係をダウンロードするために別のインターネット接続を作成する必要がある理由。Mavenはローカルリポジトリを形成し、インターネット全体をダウンロードするため、依存関係をローカルで見つけることができるはずですが、なぜこのモデルが使用されるのですか. ファイアウォールの背後にいて、すべてにアクセスできるわけではなく、ツールが依存関係をダウンロードできません。ほとんどの職場環境で同じ状況があると確信しています。

最近、私は clojure を使い始めましたが、clojure 用に Eclipse を構成するのは大変でした。leiningen は、あらゆる Clojure 開発で使用しなければならない何らかの魔法であると考えられています。時々、clojure の概念を学ぶよりも leiningen を学ぶ方が重要だと感じることがあります。「自己インストール」が機能しなかったため、leiningen のいわゆる「スタンドアロン」jar ファイルをダウンロードしました。しかし、それは私をだましました。「lein」コマンドを実行するとすぐに、インターネット接続が確立され、何かをダウンロードしようとします。なぜ?インターネットに接続せずにヘルプ メニューを印刷することさえありません。なぜ?私が知らないので、インターネットファイアウォールをバイパスせずにその要求を満たす方法はありません。また、この男が何を望んでいるのかを誰も教えてくれません。他に方法はありません。

そして、誰もが独自の発明をしているようです。Java には単純な ant があり、Maven に移行しました。一部のプロジェクトでは Ruby ベースの Builder が使用され、Clojure には leiningen があり、Scala には sbt があります。Goには他にも何かがあります。なぜ?すでに複雑さでいっぱいの世界で、なぜこの複雑さを増す必要があるのか​​. ツールが 1 つしかないのはなぜですか。

Java テクノロジーの専門家の皆様、私の暴言をお許しください。この質問は、物事を理解するのに十分な努力をしていない人からのように、反対票を投じられて閉じられると確信しています。しかし、私はこの不必要な複雑さと戦うのに十分な時間を費やしてきたと信じてください.

他の人がこれをどのように回避するかを知りたいだけですか、それともこれらの問題に直面しているのは私だけですか.

4

1 に答える 1

3

この質問は答えを受け入れることができないと思います。私は謙虚に要素を提供することができます, うまくいけば、それらはあなたが問題についていくつかの視点を得るのに役立ちます.

私が Java ビルドシステムで特定した主な問題は 2 つあります。

  • それらのいくつかは宣言的であり、他のものはスクリプトを使用しています
  • 制御を構築して実行するための Java ツールの断片化は、技術的な選択ではなく、人々とその分野における Java の管理に結びついています。

Maven は、標準的な方法で正式な文法を使用してビルドを定義する方法の最重要事項です。pom.xml ファイルには、ビルドだけでなく、成果物、プロジェクト メタデータ、モジュール、および取り込まれたプラグインの ID が含まれます。依存関係とリポジトリの宣言を特に注意して扱います。Maven は宣言的です。

特定のプログラマーにとって、これは素晴らしいことであり、新しいプロジェクトを頻繁に作成することはありません。時間の経過とともにうまく機能し、ビルドをうまく統合します。

Ant は、実行するタスクを定義し、特定の順序で連鎖させる別のシステムです。すべての定義は XML を使用して作成されます。つまり、スクリプトを作成し、それらをどのように組み合わせるかを宣言することになります。

Buildr (完全な開示: 私はそこのコミッターです) は、ビルドが追加の手順と複雑なテストを実行する必要がある場合の宣言型アプローチの非効率性と、XML を使用することの硬直性に対処することへの不満から作成されたビルド システムです。ビルド。これはスクリプトベースであり、構成よりも規則を強制します (いくつかの適切なデフォルトが期待されますが、変更が必要な場合は運転できます)。

私は Gradle と SBT に精通していませんが、私が聞いたところによると、これらはこのアプローチを拡張して構築していると思います。

これにより、ビルド ツールの観点から、状況をよりよく把握できることを願っています。

標準ビルド ツールが登場しなかった理由は、おそらく、Sun が Java でビルド ツールをプッシュしなかったことに関係しています。最終的に、彼らは Ant を採用したと思います (ほとんどの JSR jar が Ant でビルドされています)。これらのビルド システムの一部を拡張して、この分野でビルドされた製品もいくつかあります。コードを維持するために支払われる人々と、コードを維持するために支払われる人々との間には、常に大きな違いがあります。

そしてまあ、人々は主張します。ビルド システムは、フレーム ウォーを開始するための優れた方法です。いくつかの共通要素は現在、Maven アーティファクトの周りにうまく収まっていますが、標準について合意するのに苦労しています。

インターネットを何度も何度もダウンロードする必要性については、かなり長い話になりますが、不要なダウンロードが必要になる原因となる可能性のあるいくつかのことを次に示します。

  • SNAPSHOT を使用するすべての依存関係は、最新のスナップショットを取得しようとします。これは素晴らしい計画ですが、それには犠牲が伴います。スナップショットに依存するものに依存し、そのためにダウンロードを取得する場合があります。

  • Maven はアーティファクトを再ダウンロードしませんが、時々 md5 をチェックします。これは簡単に修正できます。コマンド ラインから -O オプションを使用するだけです。

Builder のようなツールは、この問題を完全に修正することを中心に構築されました。まず、あなたが言ったものだけをダウンロードします。第二に、あなたが要求しない限り、接続は再確立されません。デフォルトでは、Buildr は推移的な依存関係ゲームを実行しませんが、要求することはできますが、明示的に実行する必要があります。

これが有益な情報であり、Java の土地でのあなたの旅が今後の苦痛を軽減することを願っています.

于 2013-03-07T18:40:18.527 に答える