Friday, May 14, 2010

Maven: How to prevent generate-sources phase executing twice

The Problem

So, you've been using Maven to build your project. You require to generate some sources, so you've figured out how to attach a plugin goal to the generate-sources lifecycle phase. This looks like it works great for a while running mvn package ....

When you decide to finally release your project using the maven-release-plugin, you notice that your source generation plugin executes twice, slowing your build and possibly even breaking it. You are now trying to figure out why your sources are being generated twice, or more specifically why the generate-sources lifecycle phase is being executed twice.

You predictably do a google search and scan the Maven issues. You find several complaints and reports open that mention a similar problem related to the maven-sources-plugin sources:jar goal causing the generate-sources phase to execute twice. Suprisingly these issues are marked fix or mention what looks like a workaround and no matter what you do, the plugin goals you have attached to the generate-sources phase are still being executed twice.

Here I attempt to explain what is really going on and provide you a real workaround for it.

History

An old relic of the maven-release-plugin is that in Maven's Super POM there is defined a profile with id of release-profile. It can be activated by the releaseProfile property being set, in this case to true. This was/is a way for the release plugin to activate the creation of source and javadoc jars for a release by default. The profile defines a maven-source-plugin and maven-javadoc-plugin configuration that attaches the jar goals of those plugins to the package phase.

So what this means is that when using the maven-release-plugin or activating the release-profile manually by setting the releaseProfile property, source:jar goal gets called during the build, which will trigger the execution of generate-sources lifecycle phase to run, even if it already did in the same build.

Changing the Maven Super POM to instead call source:jar-no-fork would fix this issue, yet changing the Super POM is not something taken lightly, and in fact may have never been proposed for this case.

Until the problem is permanently addressed, here I outline a workaround that prevents the duplicate generate-sources phase from running.

Workaround

I've tested the following instructions with Maven 2.0.11, 2.2.1 and 3.0-beta-1. The version of maven-source-plugin used was 2.1.1.

  1. First lets reproduce the problem on a sample project. Using the maven-archetype-plugin is the simplest way.
    mvn archetype:generate
    
  2. Next since the problem is that generate-sources phase gets run twice, we need a visual cue when this occurs. A simple solution is attach a message to this phase with the maven-antrun-plugin.

    Add the following to your test project pom.xml:
    <build>
      <plugins>
        <plugin>
          <artifactId>maven-antrun-plugin</artifactId>
          <version>1.3</version>
          <executions>
            <execution>
              <id>generate-sources-flag</id>
              <phase>generate-sources</phase>
              <goals>
                <goal>run</goal>
              </goals>
              <configuration>
                <tasks>
                  <echo>GENERATE SOURCES IS EXECUTING</echo>
                </tasks>
              </configuration>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
    
  3. Next lets verify that the generate-sources phase is getting executed twice when activating the release-profile. The release profile defined in the super pom gets activated by setting the performRelease property on the cmd line.

    $mvn clean install -DperformRelease=true
    Using Java version: 1.6
    [INFO] Scanning for projects...
    [INFO]
    [INFO] ------------------------------------------------------------------------
    [INFO] Building nofork 1.0-SNAPSHOT
    [INFO] ------------------------------------------------------------------------
    [INFO]
    [INFO] --- maven-clean-plugin:2.4:clean (default-clean) @ nofork ---
    [INFO] Deleting /Users/plynch/dev/plynch/trial/nofork/target
    [INFO]
    [INFO] --- maven-antrun-plugin:1.3:run (generate-sources-flag) @ nofork ---
    [INFO] Executing tasks
         [echo] GENERATE SOURCES IS EXECUTING
    [INFO] Executed tasks
    [INFO]
    [INFO] --- maven-resources-plugin:2.4.2:resources (default-resources) @ nofork ---
    [WARNING] Using platform encoding (MacRoman actually) to copy filtered resources, i.e. build is platform dependent!
    [INFO] skip non existing resourceDirectory /Users/plynch/dev/plynch/trial/nofork/src/main/resources
    [INFO]
    [INFO] --- maven-compiler-plugin:2.3:compile (default-compile) @ nofork ---
    [WARNING] File encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
    [INFO] Compiling 1 source file to /Users/plynch/dev/plynch/trial/nofork/target/classes
    [INFO]
    [INFO] --- maven-resources-plugin:2.4.2:testResources (default-testResources) @ nofork ---
    [WARNING] Using platform encoding (MacRoman actually) to copy filtered resources, i.e. build is platform dependent!
    [INFO] skip non existing resourceDirectory /Users/plynch/dev/plynch/trial/nofork/src/test/resources
    [INFO]
    [INFO] --- maven-compiler-plugin:2.3:testCompile (default-testCompile) @ nofork ---
    [WARNING] File encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
    [INFO] Compiling 1 source file to /Users/plynch/dev/plynch/trial/nofork/target/test-classes
    [INFO]
    [INFO] --- maven-surefire-plugin:2.5:test (default-test) @ nofork ---
    [INFO] Surefire report directory: /Users/plynch/dev/plynch/trial/nofork/target/surefire-reports
    
    -------------------------------------------------------
     T E S T S
    -------------------------------------------------------
    Running com.company.AppTest
    Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.029 sec
    
    Results :
    
    Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
    
    [INFO]
    [INFO] --- maven-jar-plugin:2.3:jar (default-jar) @ nofork ---
    [INFO] Building jar: /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT.jar
    [INFO]
    [INFO] >>> maven-source-plugin:2.1.1:jar (attach-sources) @ nofork >>>
    [INFO]
    [INFO] --- maven-antrun-plugin:1.3:run (generate-sources-flag) @ nofork ---
    [INFO] Executing tasks
         [echo] GENERATE SOURCES IS EXECUTING
    [INFO] Executed tasks
    [INFO]
    [INFO] <<< maven-source-plugin:2.1.1:jar (attach-sources) @ nofork <<<
    [INFO]
    [INFO] --- maven-source-plugin:2.1.1:jar (attach-sources) @ nofork ---
    [INFO] Building jar: /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT-sources.jar
    [INFO]
    [INFO] --- maven-javadoc-plugin:2.5:jar (attach-javadocs) @ nofork ---
    [WARNING] Source files encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
    Loading source files for package com.company...
    Constructing Javadoc information...
    Standard Doclet version 1.6.0_17
    Building tree for all the packages and classes...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//App.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//package-frame.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//package-summary.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//package-tree.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/constant-values.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//class-use/App.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//package-use.html...
    Building index for all the packages and classes...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/overview-tree.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/index-all.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/deprecated-list.html...
    Building index for all classes...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/allclasses-frame.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/allclasses-noframe.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/index.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/help-doc.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/stylesheet.css...
    [INFO] Building jar: /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT-javadoc.jar
    [INFO]
    [INFO] --- maven-install-plugin:2.3:install (default-install) @ nofork ---
    [INFO] Installing /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT.jar to /Volumes/D/m2r/com/company/nofork/1.0-SNAPSHOT/nofork-1.0-SNAPSHOT.jar
    [INFO] Installing /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT-sources.jar to /Volumes/D/m2r/com/company/nofork/1.0-SNAPSHOT/nofork-1.0-SNAPSHOT-sources.jar
    [INFO] Installing /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT-javadoc.jar to /Volumes/D/m2r/com/company/nofork/1.0-SNAPSHOT/nofork-1.0-SNAPSHOT-javadoc.jar
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 11.162s
    [INFO] Finished at: Thu May 13 10:39:58 EDT 2010
    [INFO] Final Memory: 13M/264M
    [INFO] ------------------------------------------------------------------------
    

    Notice our message gets printed twice, verifying the double execution. So lets proceed to fix the problem.
  4. Make the following additions to your pom.xml.
    1. First we override the super-pom maven-sources-plugin execution with id of attach-sources. This excution is what calls the source:jar goal. The special trick used here binds this execution to a non-existent lifecycle phase of DISABLE_FORKED_LIFECYCLE_MSOURCES-13 - a phase which will never be reached, thus essentially disabling this execution.

      <pluginManagement>
        <plugins>
          <plugin>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.1.1</version>
            <executions>
              <!-- here we override the super-pom attach-sources executionid which
              calls sources:jar goal. That goals forks the lifecycle, causing
              the generate-sources phase to be called twice for the install goal.
              This causes any other plugin bound to the generate-sources phase to
              be called twice which usually has nasty side effects, let alone
              creating duplicate processing and longer build times. -->
              <execution>
                <id>attach-sources</id>
                <phase>DISABLE_FORKED_LIFECYCLE_MSOURCES-13</phase>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </pluginManagement>
      
    2. Next, since we would still like releases using the release-profile profile to include a sources jar file, we define a new profile with the same id as the one in the super POM. This time however we bind the execution to the jar-no-fork goal, which does not trigger the generate-sources phase to be called twice.

      <profiles>
        <!-- MSOURCES-13 related workaround overriding super-pom -->
        <profile>
          <id>release-profile</id>
          <activation>
            <property>
              <name>performRelease</name>
              <value>true</value>
            </property>
          </activation>
          <build>
            <plugins>
              <plugin>
                <inherited>true</inherited>
                <artifactId>maven-source-plugin</artifactId>
                <executions>
                  <execution>
                    <id>attach-sources-no-fork</id>
                    <inherited>true</inherited>
                    <goals>
                      <goal>jar-no-fork</goal>
                    </goals>
                  </execution>
                </executions>
              </plugin>
            </plugins>
          </build>
        </profile>
      </profiles>
      
  5. Now we run the same command and verify that our solution worked.
    $mvn clean install -DperformRelease=true
    Using Java version: 1.6
    [INFO] Scanning for projects...
    [INFO]
    [INFO] ------------------------------------------------------------------------
    [INFO] Building nofork 1.0-SNAPSHOT
    [INFO] ------------------------------------------------------------------------
    [INFO]
    [INFO] --- maven-clean-plugin:2.4:clean (default-clean) @ nofork ---
    [INFO] Deleting /Users/plynch/dev/plynch/trial/nofork/target
    [INFO]
    [INFO] --- maven-antrun-plugin:1.3:run (generate-sources-flag) @ nofork ---
    [INFO] Executing tasks
         [echo] GENERATE SOURCES IS EXECUTING
    [INFO] Executed tasks
    [INFO]
    [INFO] --- maven-resources-plugin:2.4.2:resources (default-resources) @ nofork ---
    [WARNING] Using platform encoding (MacRoman actually) to copy filtered resources, i.e. build is platform dependent!
    [INFO] skip non existing resourceDirectory /Users/plynch/dev/plynch/trial/nofork/src/main/resources
    [INFO]
    [INFO] --- maven-compiler-plugin:2.3:compile (default-compile) @ nofork ---
    [WARNING] File encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
    [INFO] Compiling 1 source file to /Users/plynch/dev/plynch/trial/nofork/target/classes
    [INFO]
    [INFO] --- maven-resources-plugin:2.4.2:testResources (default-testResources) @ nofork ---
    [WARNING] Using platform encoding (MacRoman actually) to copy filtered resources, i.e. build is platform dependent!
    [INFO] skip non existing resourceDirectory /Users/plynch/dev/plynch/trial/nofork/src/test/resources
    [INFO]
    [INFO] --- maven-compiler-plugin:2.3:testCompile (default-testCompile) @ nofork ---
    [WARNING] File encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
    [INFO] Compiling 1 source file to /Users/plynch/dev/plynch/trial/nofork/target/test-classes
    [INFO]
    [INFO] --- maven-surefire-plugin:2.5:test (default-test) @ nofork ---
    [INFO] Surefire report directory: /Users/plynch/dev/plynch/trial/nofork/target/surefire-reports
    
    -------------------------------------------------------
     T E S T S
    -------------------------------------------------------
    Running com.company.AppTest
    Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.026 sec
    
    Results :
    
    Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
    
    [INFO]
    [INFO] --- maven-jar-plugin:2.3:jar (default-jar) @ nofork ---
    [INFO] Building jar: /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT.jar
    [INFO]
    [INFO] --- maven-source-plugin:2.1.1:jar-no-fork (attach-sources-no-fork) @ nofork ---
    [INFO] Building jar: /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT-sources.jar
    [INFO]
    [INFO] --- maven-javadoc-plugin:2.5:jar (attach-javadocs) @ nofork ---
    [WARNING] Source files encoding has not been set, using platform encoding MacRoman, i.e. build is platform dependent!
    Loading source files for package com.company...
    Constructing Javadoc information...
    Standard Doclet version 1.6.0_17
    Building tree for all the packages and classes...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//App.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//package-frame.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//package-summary.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//package-tree.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/constant-values.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//class-use/App.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/com/company//package-use.html...
    Building index for all the packages and classes...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/overview-tree.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/index-all.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/deprecated-list.html...
    Building index for all classes...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/allclasses-frame.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/allclasses-noframe.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/index.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/help-doc.html...
    Generating /Users/plynch/dev/plynch/trial/nofork/target/apidocs/stylesheet.css...
    [INFO] Building jar: /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT-javadoc.jar
    [INFO]
    [INFO] --- maven-install-plugin:2.3:install (default-install) @ nofork ---
    [INFO] Installing /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT.jar to /Volumes/D/m2r/com/company/nofork/1.0-SNAPSHOT/nofork-1.0-SNAPSHOT.jar
    [INFO] Installing /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT-sources.jar to /Volumes/D/m2r/com/company/nofork/1.0-SNAPSHOT/nofork-1.0-SNAPSHOT-sources.jar
    [INFO] Installing /Users/plynch/dev/plynch/trial/nofork/target/nofork-1.0-SNAPSHOT-javadoc.jar to /Volumes/D/m2r/com/company/nofork/1.0-SNAPSHOT/nofork-1.0-SNAPSHOT-javadoc.jar
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 24.278s
    [INFO] Finished at: Fri May 14 07:56:39 EDT 2010
    [INFO] Final Memory: 13M/264M
    [INFO] ------------------------------------------------------------------------
    
    As you can see, our verification message prints only once, yet we still get the sources jar - a good thing!

I recommend the above config be considered for adding to your organization's root pom. I also suggest the permanent solution to this issue is changing the Maven super pom release-profile to rely on jar-no-fork instead of jar goal.

Update

I'm occasionally asked how to make sure you still get a sources jar for your SNAPSHOT artifacts. Simple!

Just add the following to your normal <build> section of your pom, in addition to all of the above instructions:

  <plugins>
    <plugin>
      <artifactId>maven-source-plugin</artifactId>
      <executions>
        <execution>
          <id>attach-sources-no-fork</id>
          <inherited>true</inherited>
          <phase>generate-sources</phase>
          <goals>
            <goal>jar-no-fork</goal>
          </goals>
        </execution>
      </executions>
    </plugin>  
  </plugins>

227 comments:

«Oldest   ‹Older   201 – 227 of 227
Anonymous said...

Neon Screensaver Wallpapers High Resolution fast and free https://wallpapershigh.com/neon-screensaver

Anonymous said...

Wwe Logo Wallpapers high resolution for free https://wallpapershigh.com/wwe-logo

Anonymous said...

Blue Cherry Blossom Wallpapers high res absolutely free https://wallpapershigh.com/blue-cherry-blossom

Anonymous said...

Lancia Delta S4 Wallpapers FULL HD for free https://wallpapershigh.com/lancia-delta-s4

Irmak said...

yurtdışı kargo
resimli magnet
instagram takipçi satın al
yurtdışı kargo
sms onay
dijital kartvizit
dijital kartvizit
https://nobetci-eczane.org/
W8TZ

Reyhan said...

yurtdışı kargo
resimli magnet
instagram takipçi satın al
yurtdışı kargo
sms onay
dijital kartvizit
dijital kartvizit
https://nobetci-eczane.org/
1TJMO

Anonymous said...

Female Superhero Wallpapers High Definition for free https://wallpapershigh.com/female-superhero

Anonymous said...

Landscape Drawing Wallpapers high quality for free https://wallpapershigh.com/landscape-drawing

Anonymous said...

Landscape Drawing Wallpapers high resolution absolutely free https://wallpapershigh.com/landscape-drawing

Anonymous said...

Привет! Я недавно решил обновить интерьер своего дома и наткнулся на отличный интернет-магазин fanwood.by. Там есть огромный выбор качественного МДФ по доступным ценам. Мне особенно понравилось то, что fanwood.by является прямым поставщиком, что гарантирует низкие цены и высокое качество товара. Если ты хочешь купить МДФ в Гомеле, то я настоятельно рекомендую посетить сайт fanwood.by и проверить их ассортимент. Я уверен, ты не пожалеешь! Пройди по ссылке https://fanwood.by/shop/dsp-dvp-i-mdf/ и выбирай лучшее для своего дома!

Anonymous said...

Айо, ребятки! Есть такая штука, Арты фрайдей найт фанкин, знаете? Так вот, сегодня нашел офигенную ссылку https://creofoto.ru/arty-fraydey-nayt-fankin с кучей крутых картинок! Там такие фотки, прямо за душу берут! Если ты тоже любишь арты и фанкин, то обязательно хватай ссылку и заходи посмотреть! Гарантирую, не пожалеешь, бро!

Anonymous said...

Чуваки, вы не поверите, но наткнулся на такие угарные картинки про Жириновского! Я ржал до слез! Очень рекомендую заглянуть на этот сайт https://xwow.ru/ugarnye-pro-zhirinovskogo и посмотреть, как ему доставляют доски задницы. Я просто в шоке, какие там фотки! Не упустите возможность развеселиться и проникнуться политическим юмором. Зацените обязательно!

Anonymous said...

Привет, чуваки! У меня есть супер вещь, которую вам необходимо попробовать! Это живые обои аниме Самурай, они просто огонь! Они создадут ощущение, что вы находитесь в самом сердце сражений самураев. Ждите крутых эффектов и красочных картинок, просто кайф! В общем, не тяните, загляните на вот этот сайт https://creofoto.ru/zhivye-oboi-anime-samuray и поставьте себе эти обои, вы точно не пожалеете! Это будет такой прикол, вот увидите!

Anonymous said...

Я купил керамическую плитку Kerranova alleya в интернет-магазине RealGres и очень доволен своей покупкой. Качество плитки отличное, она прочная и долговечная. Доставка была быстрой и без проблем. Я рекомендую всем покупать керамическую плитку Kerranova alleya в магазине RealGres, они предлагают широкий выбор и хорошие цены. Узнать больше о плитке Kerranova alleya и сделать заказ можно на сайте https://www.realgres.ru/plitka-alleya-kerranova/.

Anonymous said...

Привет всем! Хотел бы поделиться своим опытом игры в интернет-казино Вавада. Мой ник на сайте - vavadakri11 и у меня просто взрывной успех! Вавада vavadakri11 buzz помог мне выиграть крупную сумму! Этот сайт действительно заслуживает внимания: удобный интерфейс, множество разнообразных слотов, приятные бонусы и быстрые выплаты. Я был приятно удивлен простой и быстрой регистрацией на сайте. К тому же, мне предложили приветственный бонус и фриспины, которые помогли мне еще больше увеличить свой выигрыш. Если вы хотите испытать азарт и получить возможность сорвать крупный джекпот, рекомендую присоединиться ко мне и попробовать свою удачу на сайте Вавада. Присоединяйтесь уже сейчас, перейдя по ссылке https://vavadax4.site/. Не упустите свой шанс на большие выигрыши!

Anonymous said...

Хочу порекомендовать интернет-магазин RealGres.ru для покупки керамической плитки. Здесь я приобрела прекрасную плитку Gambini для своей ванной комнаты. Качество плитки порадовало - она крепкая, долговечная и прекрасно выглядит. Доставка была быстрой и без проблем. Рекомендую всем, кто хочет оформить свою ванную комнату или кухню стильно и качественно. Официальный сайт магазина с плиткой Gambini: https://www.realgres.ru/gambini/.

Anonymous said...

Привет! Меня зовут Анна, и я хотела бы поделиться своим удивительным опытом в интернет-казино Вавада. Открыв случайно вавада зеркало официального сайта casino vavada live, я была приятно удивлена его удобным интерфейсом и простой регистрацией. Неожиданно для меня, я выиграла крупную сумму на слотах и получила фриспины в качестве бонуса. Быстрые выплаты позволили мне получить выигрыш без задержек. Я настоятельно рекомендую всем попробовать свою удачу на Вавада - это отличный способ развлечься и, возможно, выиграть крупные деньги! Посетите https://vavadax4.site/ и убедитесь сами. Удачи!

Anonymous said...

Эй, ребята! Загляните в нашу группу на день математики! Там полно классных картинок - такие крутые, что голова кругом пойдет! Верьте моему опыту, там даже самые скучные числа смотрятся стильно. И не забудьте покликать на ссылочку https://cvam.ru/matematika - там целый море математического веселья! Погнали, друзья, разделять эту математическую любовь!

Anonymous said...

Привет, друзья! Хочу вам рассказать о потрясающей находке - цветных эко шубах! Вы не представляете, как я в восторге от этих ярких и стильных моделей. Они не только очень теплые, но и ультрамодные! Такой яркий акцент в гардеробе точно сделает ваш образ неповторимым. Для тех, кто хочет знать больше и увидеть галерею этих модных находок, я нашел отличную статью по этой теме. Пройдите по ссылке https://fotofakt.ru/mnogosloynaya-odezhda и насладитесь великолепными фото! Я уверен, что вам понравится!

Anonymous said...

Привет, друзья! Рекомендую вам заглянуть на сайт Byry.ru и посмотреть галерею с причёсками с пробором по центру. Там вы найдёте 35 фотографий, которые вдохновят вас на новую уникальную причёску. Эти укладки прекрасно подойдут для тех, кто ищет что-то необычное и стильное. Переходите по ссылке и погрузитесь в мир модных и оригинальных причесок! Ссылка:https://douo.ru/pricheska-s-proborom-po-tsentru/

Anonymous said...

Я совершил удивительное открытие! Спустя несколько месяцев игры на разных онлайн-казино, я наткнулся на Вавада - официальный сайт бонусы vavada zerkalona5. Не могу поверить, какую удачу я имел! Вавада зеркало это настоящая находка для любителей азартных игр: удобный интерфейс, множество разнообразных слотов и фантастические бонусы. Я уже успел получить приветственный бонус и пару фриспинов, а также быстро вывести выигрыш - крупные суммы на мою банковскую карту. Рад, что регистрация прошла просто и быстро. Не могу нарадоваться! Присоединяйтесь и вам повезет на Вавада! https://vavadah.site/

Anonymous said...

Привет всем! Хочу поделиться радостью и рекомендовать интернет-казино Вавада. Вот недавно, я решил испытать свою удачу и зарегистрировался там. Не могу не отметить, что процесс регистрации прошел очень просто и быстро. И тут, как раз вовремя, вавада подарок на день рождения - крупная сумма на мой счет! Я воспользовался приветственным бонусом, получил фриспины и начал играть в любимые слоты. Интерфейс удобный, с высококачественной графикой и простыми правилами. Хочу отметить, что выплаты там происходят очень быстро, уже через несколько минут после выигрыша деньги были на моем счету. Играя в Вавада, я получил не только море удовольствия, но и значительные выигрыши. Если вы ищете надежное и выгодное онлайн-казино, то рекомендую вам попробовать Вавада. Посетите https://vavadaa.fun/ и убедитесь сами!

Anonymous said...

Приветствую всех! Мне очень хочется поделиться своим приятным опытом игры в казино Вавада. Когда-то я случайно узнал о нем и решил испытать удачу. И что вы думаете? У меня получилось! Вавада оказалось отличным казино, где можно выигрывать реально крупные суммы. Вот кстати, промокод, который мне помог при регистрации в казино: вавада бонус при регистрации vavadahaz8. Регистрация в Вавада действительно очень простая, а интерфейс казино очень удобный и понятный. Бонусы и фриспины тоже часто попадаются, и выплаты происходят быстро. В общем, я очень доволен своим опытом игры в Вавада и рекомендую всем попробовать свою удачу здесь. Посетите https://vavadah.site/ и убедитесь сами!

Anonymous said...

Прикольные картинки и фото «Толстая невеста» в зачетной тематике, дорогие читатели! Если нравятся потрясающие фотографии с обалденными невестами большого размера, стоит обязательно заглянуть на сайт https://fotofakt.ru/tolstaya-nevesta. Там такие сосиски, которые просто рвет шаблоны и доказывают, что красота внутри каждой из нас. Проверенно вживую, лично на свадьбе одной моей знакомой. Уверяю, это рай для тех, кто гордится своими формами и хочет найти вдохновение для себя. Подкрепите позитив, переходите ссылочку, и себе на душу и вашим подругам радость сотворите!

Anonymous said...

Эй, ребята! Знаете, нашёл супер классные фотки девушек в шортах мини! Да уж, эти снимки заставят вас загореть, аж самим станет жарко. Если хотите полюбоваться, обязательно жмите на ссылочку, которую я нашёл. Там можно будет оценить море стильных образов и красоток в ультракоротких шортиках. Обещаю, не останетесь равнодушными! Всё, держите меня семеро, я уже бегу туда смотреть на эти прикольные фотки!

Anonymous said...

Если ты ищешь стильную и удобную одежду для офиса, то тебе точно нужны офисные шорты! Эти шорты идеально подойдут для жаркого летнего дня и позволят тебе выглядеть модно и элегантно. Если хочешь найти самые крутые офисные шорты, то рекомендую заглянуть на сайт fotostage.com. Там ты найдешь широкий выбор женских офисных шорт разных стилей и расцветок. Не упусти свой шанс выглядеть стильно и комфортно в офисе!

Anonymous said...

Короче, тут пакет фото Кейт Мара бухала! У нее на самом деле крутая физиономия, так что на фотках она выглядит просто атас! Вот я как эту стену смотрю, так хочу посмотреть еще фоток. Хе-хе. А еще нашел вот ссылку на полный набор фоток Кейт Мара. Смотри вот, кейт мара, сама бомба, крутая женщина!

«Oldest ‹Older   201 – 227 of 227   Newer› Newest»

Post a Comment