كيف تتعامل مع لقطات Maven-3 الطوابع الزمنية بكفاءة؟

StackOverflow https://stackoverflow.com/questions/4275466

  •  28-09-2019
  •  | 
  •  

سؤال

الآن بعد أن فعل Maven-3 إسقاط الدعم لu003CuniqueVersion> خاطئةu003C/uniqueVersion> بالنسبة إلى مصنوعات Snapshot ، يبدو أنك بحاجة حقًا إلى استخدام لقطات طوابع زمنية. يبدو أن M2Eclipse ، الذي يستخدم Maven 3 داخليًا يتأثر بها ، لا تعمل update-snapshots عندما تكون اللقطات فريدة من نوعها.

بدا أفضل تدرب من قبل لتعيين جميع اللقطات على التفرد = خطأ

الآن ، لا يبدو أن هناك مشكلة كبيرة في التبديل إلى الإصدار الطابع الزمني ، بعد كل شيء تتم إدارته بواسطة مستودع Nexus المركزي ، والذي يمكنه حذف اللقطات القديمة في الفاصل الزمني العادي.

المشكلة هي محطات عمل المطور المحلي. ينمو مستودعهم المحلي بسرعة جداً كبير مع لقطات فريدة من نوعها.

كيف تتعامل مع هذه المشكلة؟

الآن أرى الحلول الممكنة الممكنة:

  • اطلب من المطورين تطهير المستودع على فترات منتظمة (مما يؤدي إلى الكثير من التغذية ، حيث يستغرق الأمر وقتًا طويلاً لحذف وحتى أطول لتنزيل كل ما هو مطلوب)
  • قم بإعداد بعض البرامج النصية التي تحذف الجميع لمحة أدلة من المستودع المحلي واطلب من المطورين تشغيل هذا البرنامج النصي من وقت لآخر (أفضل من الأول ، ولكن لا يزال يستغرق بعض الوقت لتشغيل اللقطات الحالية وتنزيلها)
  • استخدم التبعية: مكون الإضافي التنفيذي-المحطّن-يعاني من مشاكل عند تشغيله من Eclipse ، بسبب الملفات المفتوحة ، يجب تشغيله من كل مشروع)
  • قم بإعداد Nexus على كل محطة عمل وإعداد وظيفة لتنظيف لقطات قديمة (أفضل نتيجة ، لكنني لا أريد الحفاظ على أكثر من 50 خوادم Nexus ، بالإضافة إلى أن الذاكرة ضيقة دائمًا على محطات عمل المطورين)
  • توقف عن استخدام اللقطات على الإطلاق

ما هي أفضل طريقة لمنع مستودعك المحلي من ملء مساحة محرك الأقراص الثابتة؟

تحديث:

للتحقق من Beaviour ولإعطاء مزيد من المعلومات أقوم بإعداد خادم Nexus صغير ، وبناء مشروعين (A و B) وحاول:

أ:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>de.glauche</groupId>
  <artifactId>a</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <distributionManagement>
    <snapshotRepository>
        <id>nexus</id>
        <name>nexus</name>
        <url>http://server:8081/nexus/content/repositories/snapshots</url>
    </snapshotRepository>
  </distributionManagement>

</project>

ب:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>de.glauche</groupId>
  <artifactId>b</artifactId>
  <version>0.0.1-SNAPSHOT</version>
    <distributionManagement>
    <snapshotRepository>
        <id>nexus</id>
        <name>nexus</name>
        <url>http://server:8081/nexus/content/repositories/snapshots/</url>
    </snapshotRepository>
  </distributionManagement>
 <repositories>
    <repository>
        <id>nexus</id>
        <name>nexus</name>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        <url>http://server:8081/nexus/content/repositories/snapshots/</url>
    </repository>
 </repositories>
  <dependencies>
    <dependency>
        <groupId>de.glauche</groupId>
        <artifactId>a</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
  </dependencies>
</project>

الآن ، عندما أستخدم Maven وأركض "نشر" على "A" ، سآخذ

a-0.0.1-SNAPSHOT.jar
a-0.0.1-20101204.150527-6.jar
a-0.0.1-SNAPSHOT.pom
a-0.0.1-20101204.150527-6.pom

في المستودع المحلي. مع إصدار طابع زمني جديد في كل مرة أقوم فيها بتشغيل هدف النشر. يحدث الشيء نفسه عندما أحاول تحديث لقطات من خادم Nexus (أغلق "A" A "Project ، حذفه من المستودع المحلي ، بناء" B ")

في بيئة حيث يتم إنشاء الكثير من اللقطات (فكر في خادم Hudson ...) ، تملأ reposioty المحلي بالإصدارات القديمة سريع

تحديث 2:

لاختبار كيف ولماذا فشلت ، قمت ببعض الاختبارات. يتم إجراء كل اختبار ضد كل شيء نظيف (يتم حذف DE/GLAUCHE من كل من الجهازين والنيكس)

  • MVN نشر مع Maven 2.2.1:

يحتوي المستودع المحلي على الجهاز A

لكن: جرة واحدة فقط من طابع زمني في Nexus ، البيانات الوصفية تقرأ:

<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <groupId>de.glauche</groupId>
  <artifactId>a</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <versioning>
    <snapshot>
      <timestamp>20101206.200039</timestamp>

      <buildNumber>1</buildNumber>
    </snapshot>
    <lastUpdated>20101206200039</lastUpdated>
  </versioning>
</metadata>
  • قم بتشغيل تبعيات التحديث (على الجهاز B) في M2Eclipse (نهائي M3 المدمج) -> يحتوي المستودع المحلي على snapshot.jar + snapshot -timestamp.jar :(
  • قم بتشغيل هدف الحزمة باستخدام Maven 2.2.1 -> المستودع المحلي يحتوي على snapshot.jar + snapshot -timestamp.jar :(

حسنًا ، حاول التالي مع Maven 3.0.1 (بعد إزالة جميع آثار المشروع أ)

  • مستودع محلي على الجهاز يبدو أفضل ، فقط جرة واحدة غير مواتية

  • جرة واحدة فقط من طابع زمني في Nexus ، البيانات الوصفية:

    De.Glauche A 0.0.1-snapshot

    <snapshot>
      <timestamp>20101206.201808</timestamp>
      <buildNumber>3</buildNumber>
    </snapshot>
    <lastUpdated>20101206201808</lastUpdated>
    <snapshotVersions>
      <snapshotVersion>
        <extension>jar</extension>
        <value>0.0.1-20101206.201808-3</value>
        <updated>20101206201808</updated>
      </snapshotVersion>
      <snapshotVersion>
        <extension>pom</extension>
        <value>0.0.1-20101206.201808-3</value>
        <updated>20101206201808</updated>
      </snapshotVersion>
    </snapshotVersions>
    

  • قم بتشغيل تبعيات التحديث (على الجهاز B) في M2Eclipse (نهائي M3 المدمج) -> يحتوي المستودع المحلي على snapshot.jar + snapshot -timestamp.jar :(

  • قم بتشغيل هدف الحزمة باستخدام Maven 2.2.1 -> المستودع المحلي يحتوي على snapshot.jar + snapshot -timestamp.jar :(

لذلك ، لتلخيص: هدف "النشر" في MAVEN3 يعمل بشكل أفضل من 2.2.1 ، يبدو المستودع المحلي على آلة الإنشاء جيدًا. ولكن ، ينتهي المتلقي دائمًا بالكثير من الإصدارات الطبيعية ...

ما الخطأ الذي افعله ؟

تحديث 3

لقد قمت أيضًا باختبار العديد من التكوينات الأخرى ، أولاً استبدل Nexus بـ Artifactory -> السلوك نفسه. ثم استخدم عملاء Linux Maven 3 لتنزيل اللقطات من مدير المستودع -> لا يزال المستودع المحلي يحتوي على لقطات مدة الطابع الزمني :(

هل كانت مفيدة؟

المحلول

ال <uniqueVersion> التكوين المطبق على القطع الأثرية التي تم نشرها (عبر نشر MVN) على مستودع Maven مثل Nexus.

لإزالة هذه من Nexus ، يمكنك بسهولة إنشاء مهمة تلقائية لتطهير مستودع اللقطة كل يوم. يمكن تكوينه للاحتفاظ بعدد معين من اللقطات أو الاحتفاظ بها لفترة معينة من الزمن. إنه سهل للغاية ويعمل بشكل رائع.

تصل القطع الأثرية في المستودع المحلي على جهاز المطورين إلى هناك من هدف "التثبيت" ولا تستخدم هذه الطوابع الزمنية ... إنها تستمر فقط في استبدال إصدار اللقطة الواحد والوحيد إلا إذا كنت تقوم أيضًا بزيادة رقم المراجعة (على سبيل المثال 1.0.0- لقطة إلى 1.0.1-snapshot).

نصائح أخرى

يزيل هذا البرنامج المساعد القطع الأثرية للمشروع من المستودع المحلي. مفيد للحفاظ على نسخة واحدة فقط من لقطة محلية كبيرة.

<plugin>         
    <groupId>org.codehaus.mojo</groupId>         
    <artifactId>build-helper-maven-plugin</artifactId>         
    <version>1.7</version>         
    <executions>           
        <execution>             
            <id>remove-old-artifacts</id>             
            <phase>package</phase>             
            <goals>               
                <goal>remove-project-artifact</goal>             
            </goals>            
            <configuration>  
                <removeAll>true</removeAll><!-- When true, remove all built artifacts including all versions. When false, remove all built artifacts of this project version -->             
            </configuration>          
        </execution>         
    </executions>       
</plugin>

حسنًا ، لم يعجبني أي حلول مقترحة. غالبًا ما يزيد حذف ذاكرة التخزين المؤقت Maven بشكل كبير من حركة الشبكة ويبطئ عملية البناء. يساعد Build-Helper-Maven-Plugin فقط مع قطعة أثرية واحدة ، أردت حلًا يمكنه تطهير جميع القطع الأثرية التي عفا عليها الزمن من ذاكرة التخزين المؤقت المحلية في أمر واحد بسيط. بعد أيام قليلة من البحث ، استسلمت وقررت كتابة برنامج صغير. يبدو أن البرنامج النهائي يعمل بشكل جيد في بيئتنا. لذلك قررت مشاركتها مع الآخرين الذين قد يحتاجون إلى هذه الأداة. يمكن سحب المصادر من جيثب: https://github.com/nadestin/tools/tree/master/mavencachecleanup

فيما يتعلق بقطعة المستودع البعيد من هذا ، أعتقد أن الإجابات السابقة التي تناقش تطهير اللقطات على فاصل منتظم ستعمل. لكن لم يعلم أحد جزء مزامنة محطة العمل المحلية من سؤالك.

لم نبدأ في استخدام Maven3 حتى الآن ، لذلك لم نرى بعد لقطات تبدأ في البناء على الآلات المحلية.

لكن لدينا مشاكل مختلفة مع M2Eclipse. عندما يكون لدينا "دقة مساحة العمل" ممكّنة ويوجد المشروع داخل مساحة العمل لدينا ، عادة ما تبقينا تحديثات المصدر على حافة النزيف. لكننا وجدنا أنه من الصعب للغاية الحصول على M2Eclipse لتحديث نفسه مع القطع الأثرية المنشورة مؤخرًا في Nexus. نحن نواجه مشاكل مماثلة داخل فريقنا وهي مشكلة خاصة لأن لدينا رسم بياني كبير للمشروع ... هناك الكثير من التبعيات التي لن تكون في مساحة العمل الخاصة بك ولكنها ستحصل على لقطات منشورة بشكل متكرر.

أنا متأكد من أن هذا يتلخص في مشكلة في M2Eclipse حيث لا يتعامل مع اللقطات تمامًا كما ينبغي. يمكنك أن ترى في وحدة التحكم Maven داخل Eclipse حيث يخبرك M2Eclipse بأنه يتخطى تحديث لقطة تم نشرها مؤخرًا لأنها حصلت على نسخة مخزنة مؤقتًا. إذا قمت بعمل -u من تكوين التشغيل أو من سطر الأوامر ، مافن سوف يلتقط تغيير البيانات الوصفية. ولكن يجب أن يخبر الاختيار "تحديث لقطات ..." M2Eclipse أن تنتهي من Maven هذا ذاكرة التخزين المؤقت. لا يبدو أنه يتم تمريره. يبدو أن هناك خطأ يتم تقديمه لهذا إذا كنت مهتمًا بالتصويت لصالحه:https://issues.sonatype.org/browse/mngeclipse-2608

لقد ذكرت هذا في تعليق في مكان ما.

يبدو أن أفضل حلول لهذه المشكلة هو جعل المطورين تطهير محطات عملهم المحلية عندما تبدأ الأمور في الانهيار من داخل M2Eclipse. حل مشابه لمشكلة مختلفة ... أبلغ آخرون عن مشاكل مع Maven 2.2.1 و 3 دعم M2Eclipse ، ورأيت نفس الشيء.

آمل إذا كنت تستخدم MAVEN3 ، يمكنك تكوينه لسحب أحدث لقطة فقط ، وذاكرة التخزين المؤقت التي يقولها المستودع (أو حتى تنتهي صلاحيته باليد). نأمل ألا تحتاج إلى الحصول على مجموعة من اللقطات التي تجلس في مستودعك المحلي.

هذا ما لم تكن تتحدث عن خادم بناء يقوم يدويًا بعمل mvn install عليهم. فيما يتعلق بكيفية منع لقطات من البناء على بيئة مثل خادم البناء ، فقد قمنا بمهرب من تلك الرصاصة عن طريق استخدام كل بناء مساحة عمل خاصة به ومستودع محلي (على الرغم من ذلك ، في Maven 2.2.1 ، بعض الأشياء مثل أشياء مثل يبدو أن POMS يخرج دائمًا من ~/.m2/ropository) اللقطات الإضافية تتمسك بها حقًا فقط لبناء واحد ثم يتم إسقاطها (وتنزيلها مرة أخرى من نقطة الصفر). لذلك رأينا أن هذا النهج ينتهي به المطاف في تناول مساحة أكبر لتبدأ ، لكنه يميل إلى البقاء أكثر استقرارًا من حل كل شيء من مستودع واحد. يسمى هذا الخيار (على Hudson) "استخدام مستودع Maven الخاص" وهو تحت الزر المتقدم لقسم الإنشاء في تكوينات المشروع عند تحديدها للبناء باستخدام Maven. هنا وصف المساعدة لهذا الخيار:

عادةً ما يستخدم Hudson مستودع Maven المحلي كما هو محدد بواسطة Maven - يبدو أن العملية الدقيقة غير موثقة ، لكنها ~/.m2/مستودع ويمكن تجاوزها في ~/.m2/settings.xml (انظر المرجع لمزيد من التفاصيل .) هذا يعني عادة أن جميع الوظائف التي يتم تنفيذها على نفس العقدة تشترك في مستودع Maven واحد. الجانب العلوي من هذا هو أنه يمكنك حفظ مساحة القرص ، ولكن الجانب السلبي من هذا هو أنه في بعض الأحيان يمكن أن تتداخل تلك التصميم مع بعضها البعض. على سبيل المثال ، قد ينتهي بك الأمر إلى أن ينجح بشكل غير صحيح ، لمجرد أن لديك جميع التبعيات في مستودعك المحلي ، على الرغم من أن أيا من المستودعات في POM قد يكون لها.

هناك أيضًا بعض المشكلات المبلغ عنها فيما يتعلق بوجود عمليات Maven المتزامنة التي تحاول استخدام نفس المستودع المحلي.

عندما يتم التحقق من هذا الخيار ، سيطلب Hudson Maven استخدام مساحة عمل $/.repository كمستودع Maven المحلي. هذا يعني أن كل وظيفة ستحصل على مستودع Maven المعزول الخاص به فقط لنفسه. إنه يحدد المشكلات المذكورة أعلاه ، على حساب استهلاك مساحة القرص الإضافي.

عند استخدام هذا الخيار ، فكر في إعداد مدير Artifact Maven بحيث لا تضطر إلى ضرب مستودعات Maven عن بُعد كثيرًا.

إذا كنت تفضل تنشيط هذا الوضع في جميع وظائف Maven التي تم تنفيذها على Hudson ، راجع التقنية الموضحة هنا.

آمل أن يساعد هذا - إذا لم يعالج مشكلتك ، فيرجى إخبارنا بمكان فاتني.

في مروع, ، حذف الملفات الطابع الزمني مثل artifact-0.0.1-20101204.150527-6.jar يمكن أن تكون بسيطة للغاية:

root = 'path to your repository'

new File(root).eachFileRecurse {
  if (it.name.matches(/.*\-\d{8}\.\d{6}\-\d+\.[\w\.]+$/)) {
    println 'Deleting ' + it.name
    it.delete()
  }
}

تثبيت رائع, ، احفظ البرنامج النصي في ملف وجدولة التنفيذ في كل أسبوع ، ابدأ ، تسجيل الدخول ، أيا كان يناسبك.

أو يمكنك حتى توصيل التنفيذ إلى بناء Maven ، باستخدام GmavenPlus-Plugin. لاحظ ، كيف يتم تعيين موقع المستودع من قبل Maven في العقار settings.localRepository ثم تربيها من خلال التكوين إلى متغير repository:

  <plugin>
    <groupId>org.codehaus.gmavenplus</groupId>
    <artifactId>gmavenplus-plugin</artifactId>
    <version>1.3</version>
    <executions>
      <execution>
        <phase>install</phase>
        <goals>
          <goal>execute</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <properties>
        <property>
          <name>repository</name>
          <value>${settings.localRepository}</value>
        </property>
      </properties>
      <scripts>
        <script><![CDATA[
          new File(repository).eachFileRecurse {
            if (it.name.matches(/.*\-\d{8}\.\d{6}\-\d+\.[\w\.]+$/)) {
              println 'Deleting snapshot ' + it.getAbsolutePath()
              it.delete()
            }
          }
        ]]></script>
      </scripts>
    </configuration>
    <dependencies>
      <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>2.3.7</version>
        <scope>runtime</scope>
      </dependency>
    </dependencies>
  </plugin>  

أضف المعلمة التالية في ملف POM الخاص بك

بوم

<configuration>
<outputAbsoluteArtifactFilename>true</outputAbsoluteArtifactFilename>
</configuration>

https://maven.apache.org/plugins/maven-dependency-plugin/copy-mojo.html

مثال بوم

<plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.10</version>
        <executions>
          <execution>
            <id>copy</id>
            <phase>package</phase>
            <goals>
              <goal>copy</goal>
            </goals>
            <configuration>
              <artifactItems>
                <artifactItem>
                  <groupId>junit</groupId>
                  <artifactId>junit</artifactId>
                  <version>3.8.1</version>
                  <type>jar</type>
                  <overWrite>false</overWrite>
                  <outputDirectory>${project.build.directory}/alternateLocation</outputDirectory>
                  <destFileName>optional-new-name.jar</destFileName>
                </artifactItem>
              </artifactItems>
              **<outputAbsoluteArtifactFilename>true</outputAbsoluteArtifactFilename>**
              <outputDirectory>${project.build.directory}/wars</outputDirectory>
              <overWriteReleases>false</overWriteReleases>
              <overWriteSnapshots>true</overWriteSnapshots>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

تكوين في جنكينز:

// copy artifact 
copyMavenArtifact(artifact: "commons-collections:commons-collections:3.2.2:jar", outputAbsoluteArtifactFilename: "${pwd()}/target/my-folder/commons-collections.jar")
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top