12

Scalaバージョン間のソース互換性しかないため、残念ながら、サポートするscalaバージョンごとにscalatestscalamockなどのライブラリをコンパイルする必要があります。私が困惑しているのは、ライブラリに大量のアーティファクト(scalatest_2.9.0、scalatest_2.9.1、scalatest_2.10など)が用意されていることです。これは、scalaバージョンごとに1つであり、Mavenリポジトリには同じソース。私の本能は、scalaバージョンごとに分類子を備えた1つのアーティファクトを使用することを教えてくれます。(実際、MavenPomリファレンスこれは、アーティファクトのjdk14およびjdk15分類子を使用して行われることがあると述べていますが、これは私と似ているようです。

4

2 に答える 2

5

私は間違っているかもしれませんが、分類子の目的が「同じPOMから構築されたが、内容が異なるアーティファクトを区別する」ことである場合、それらをscalaバージョン管理に使用しない非常に正当な理由がわかります。scalaバージョンは単なるバイナリではありません。互換性がないため、ソースと互換性がない可能性があります。たとえば、scalaを2.7から2.8にアップグレードするとき、コードベースにいくつかの重要な変更を加える必要がありました。Scala 2.7バージョンと2.8バージョンの両方を同時に保持したい場合は、並列ブランチを作成する必要があり、両方のブランチに同じソースコードが含まれることはありません。

「同じPOMから」を読んだとき、それは同じソースコードからも意味していることを理解しています。これは、これら2つのコードブランチには当てはまらないことは明らかです。

もう1つの重要な理由は、分類子が本質的に単一の文字列であり、すでに多くのことに使用されていることです。多かれ少なかれ標準的な分類子には、「sources」、「javadoc」、または「resources」が含まれます。これらの分類子の意味はscalaプロジェクトでも同じであり、これから説明するように、scalaバージョンとは完全に直交しています。

Mavenのドキュメントでは、「jdk15」や「jdk14」などの分類子を使用して、バイナリアーティファクトがコンパイルされたjvmのバージョンを示すことを提案しています。Javaコードには下位互換性があるため、原則として、両方の分類子("jdk15"または"jdk14")のアーティファクトは同じソースコードからコンパイルされます。これが、「ソース」アーティファクトの分類子を複製する必要がない、つまり、複製する必要がない理由です「sources-jdk14」および「sources-jdk15」という名前の分類子が必要です。ただし、同じ理論的根拠をscalaバージョンに適用することはできません。scala2.7とscala 2.8のどちらに対してコンパイルする場合でも、異なるソースコードが必要になる可能性があるため、「sources-scala2.7」や「 source-scala2.8"。したがって、すでに複合分類器があります。バイナリアーティファクトに関しては、ターゲットのjv​​mバージョン(異なるjvmバージョンをターゲットにするようにscalaコードをコンパイルできることを忘れないでください)だけでなく、コンパイル対象のscalaバージョンも区別する必要があります。したがって、「jdk14-scala2.7」、「jdk14-scala2.8」、「jdk15-scala2.7」、「jdk15-scala2.8」のようになります。複合分類器のさらに別のセット。つまり、持ち帰りのメッセージは、scalaバージョンは実際にはアーティファクトを分類する別の方法であり、既存のすべての分類子に対して完全にオルソグナールであるということです。はい、実際には上記のような複合分類子( "sources-scala2.7"など)を使用できますが、標準の分類子は使用しないため、それ自体は十分に混乱しますが、分類子の周りのすべてのツールを変更する必要があります。 Scala(Javaのみ)の知識はないが、「ソース」アーティファクトを自動的に公開する方法を知っているビルドツールを使用するとどうなりますか?彼が代わりに「sources-scala2.7」アーティファクトを公開することを知っているように、このビルドツールを変更する必要がありますか?一方、(ベース)アーティファクト名でscalaバージョンをエンコードし、それをビルドツールに渡すと、すべてが通常どおりに機能し、「ソース」を含むアーティファクトを取得します。

全体として、そしてすぐに直感に反して、名前にscalaバージョンをエンコードすると、既存のJavaビルドエコシステムへの統合が向上します。

于 2013-02-27T09:20:39.777 に答える
2

Scalaは、.classパッチリリース(Major.Minor.Patchバージョン仕様の3番目のコンポーネント)間でのみ、バイトコード出力(ファイル)のバージョン間互換性を提供します。

Mavenには、これをアーティファクトのファーストクラスのプロパティとして適切にエンコードする場所がないため、名前の規則に従ってエンコードする必要があります。

悲しいことに...

于 2013-02-26T21:02:10.497 に答える