2013-08-16 99 views
2

爲了節省編譯時間,我試圖將widgetset的編譯分解到它自己的TeamCity構建項目,我們使用nexus作爲回購。然後,Vaadin「基礎項目」將包含對組件工件的依賴關係,以獲取當前版本。我確信這是以前完成的。分解Vaadin的widgetset編譯

在TeamCity中構建的widgetset項目很好。罐子和poms被正確地上傳到nexus。我已經打開罐子,以確保一切都在其位置。到現在爲止還挺好。

在eclipse中,基礎項目確實獲取widgetset工件並將其包含在其庫中。看起來不錯。

然而,當我從月食基地項目「MVN清潔包」,並運行在Tomcat上,我得到的Web瀏覽器以下錯誤:

Failed to load the widgetset: ./VAADIN/widgetsets/com.example.somerandomapp.web.AppWidgetSet/com.example.somerandomapp.web.AppWidgetSet.nocache.js?1376642850734 

當我檢查項目結構,我在目標文件夾下找不到VAADIN/widgetset-folder。另外,在Maven依賴關係jar文件中,有一個包含gwt-unitCache的VAADIN文件夾和一個包含widgetset-goodies的VAADIN.widgetsets文件夾,以及上述錯誤消息中提到的文件。

我無法理解這一點。我不是maven專業人士,所以我可能錯過了一些微不足道的東西。此外,我不是Vaadin專業人員,所以我可能錯過了那裏的小事。

我真的很希望有人在那裏能幫我把這艘船拿到水裏。我將不勝感激!

Vaadin版本:7.1.1 Maven的版本:3.0.4

我的基本項目的pom.xml(留出一些東西爲簡潔起見):

<dependencies> 

    <!-- Some Random App - Commons --> 
    <dependency> 
     <groupId>com.example.somerandomapp.common</groupId> 
     <artifactId>somerandomapp-common-widgetset</artifactId> 
     <version>0.0.5-SNAPSHOT</version> 
    </dependency> 

    <!-- Vaadin --> 
    <dependency> 
     <groupId>com.vaadin</groupId> 
     <artifactId>vaadin-server</artifactId> 
     <version>${vaadin.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.vaadin</groupId> 
     <artifactId>vaadin-client-compiled</artifactId> 
     <version>${vaadin.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.vaadin</groupId> 
     <artifactId>vaadin-client</artifactId> 
     <version>${vaadin.version}</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.vaadin</groupId> 
     <artifactId>vaadin-push</artifactId> 
     <version>${vaadin.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.vaadin</groupId> 
     <artifactId>vaadin-themes</artifactId> 
     <version>${vaadin.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>${javax-servlet-api.version}</version> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-war-plugin</artifactId> 
      <version>${maven-war-plugin.version}</version> 
      <configuration> 
       <failOnMissingWebXml>false</failOnMissingWebXml> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

我的視窗元件,聚甲醛(離開了爲簡潔一些東西):

<!-- same Vaadin-plugins as in the "base project" --> 
<!-- maven compiler, release, javadoc, deploy and source artifacts --> 
    <plugin> 
     <artifactId>maven-clean-plugin</artifactId> 
     <version>${maven-clean-plugin.version}</version> 
     <configuration> 
      <filesets> 
       <fileset> 
        <directory>src/main/webapp/VAADIN/widgetsets</directory> 
       </fileset> 
      </filesets> 
     </configuration> 
    </plugin> 

    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>${maven-jar-plugin.version}</version> 
     <configuration> 
      <failOnMissingWebXml>false</failOnMissingWebXml> 
      <excludes> 
       <exclude>VAADIN/widgetsets/WEB-INF/**</exclude> 
      </excludes> 
     </configuration> 
    </plugin> 

    <plugin> 
     <groupId>com.vaadin</groupId> 
     <artifactId>vaadin-maven-plugin</artifactId> 
     <version>${vaadin-plugin.version}</version> 
     <configuration> 
      <extraJvmArgs>-Xmx512M -Xss1024k</extraJvmArgs> 
      <!-- <runTarget>mobilemail</runTarget> --> 
      <!-- We are doing "inplace" but into subdir VAADIN/widgetsets. This 
       way compatible with Vaadin eclipse plugin. --> 
      <webappDirectory>${project.build.outputDirectory}/VAADIN/widgetsets</webappDirectory> 
      <hostedWebapp>${project.build.outputDirectory}/VAADIN/widgetsets</hostedWebapp> 
      <noServer>true</noServer> 
      <!-- Remove draftCompile when project is ready --> 
      <draftCompile>false</draftCompile> 
      <compileReport>true</compileReport> 
      <style>OBF</style> 
      <strict>true</strict> 
      <runTarget>http://localhost:8080/</runTarget> 
     </configuration> 
     <executions> 
      <execution> 
       <goals> 
        <goal>clean</goal> 
        <goal>resources</goal> 
        <goal>update-theme</goal> 
        <goal>update-widgetset</goal> 
        <goal>compile-theme</goal> 
        <goal>compile</goal> 
       </goals> 
      </execution> 
     </executions> 
    </plugin> 
</plugins> 
<pluginManagement> 
    <plugins>  
     <!--This plugin's configuration is used to store Eclipse m2e settings 
      only. It has no influence on the Maven build itself. --> 
     <plugin> 
      <groupId>org.eclipse.m2e</groupId> 
      <artifactId>lifecycle-mapping</artifactId> 
      <version>1.0.0</version> 
      <configuration> 
       <lifecycleMappingMetadata> 
        <pluginExecutions> 
         <pluginExecution> 
          <pluginExecutionFilter> 
           <groupId>com.vaadin</groupId> 
           <artifactId>vaadin-maven-plugin</artifactId> 
           <versionRange>[7.1.1,)</versionRange> 
           <goals> 
            <goal>update-theme</goal> 
            <goal>resources</goal> 
            <goal>compile-theme</goal> 
            <goal>update-widgetset</goal> 
           </goals> 
          </pluginExecutionFilter> 
          <action> 
           <ignore /> 
          </action> 
         </pluginExecution> 
        </pluginExecutions> 
       </lifecycleMappingMetadata> 
      </configuration> 
     </plugin> 
    </plugins> 
</pluginManagement> 
</build> 

更新: 我安裝我的MainUI類是這樣的:

@WebServlet(value = {"/foo/*", "/VAADIN/*"} , asyncSupported = true) 
@VaadinServletConfiguration(productionMode = false, ui = MainUI.class, widgetset = "com.example.somerandomapp.common.widgetset.AppWidgetSet") 

我意識到這有什麼用它做它改爲正確的視窗元件。但我仍然得到同樣的錯誤:

Failed to load the widgetset: ./VAADIN/widgetsets/com.example.somerandomapp.common.widgetset.AppWidgetSet/com.example.somerandomapp.common.widgetset.AppWidgetSet.nocache.js?1376662202437 

現在,這種錯誤顯示了正確的路徑,以在classpath中,這讓我很困惑的非緩存文件,因爲文件是存在的,lib文件夾中。 我希望這沒有進一步迷惑你....

更新2: 其實這是充足的:

@WebServlet(value = "/*", asyncSupported = true) 
@VaadinServletConfiguration(productionMode = false, ui = MainUI.class, widgetset = "com.example.somerandomapp.common.widgetset.AppWidgetSet") 

回答

1

你以後看到的變化我的OP的更新是缺少的。

我不知道爲什麼Vaadin一開始並沒有找到資源,但是在我從磁盤抹掉了「基礎項目」並從SVN重新獲取之後,做了一個項目清理和Maven更新,以及一個Tomcat工作目錄乾淨,它神奇地工作。我猜想有一些緩存的內容在鋪設。我希望這可以幫助任何想要將Vaadin組件集打散到自己的項目中的人!

0

參考Vaadin wiki(你可以找到POM。這裏的XML例子)

If your project uses custom GWT widgets, you will need to compile them with the GWT compiler. This can be done using the Codehaus GWT Maven Plugin.

您必須編譯視窗元件與GWT maven plugin(這是棘手用這個插件可以一點點,因爲你必須下載GWT SDK我認爲)

If the 'vaadin-maven-plugin' is used, the widgetset (if any) can be automatically updated based on project dependencies. This is achieved with the Maven goal 'vaadin:update-widgetset' followed by 'gwt:compile'. Running the goal clean (or gwt:clean) prior to vaadin:update-widgetset is recommended.

+0

我不完全確定這是需要使用Vaadin 7.1.1。我見過的所有例子都是使用vaadin-maven插件。你連接的例子都來自Vaadin 6,當時GWT並不是Vaadin的核心組件。 再次,一切都編譯得很好。問題在於Vaadin無法在庫中找到該組件集。 – Roger

+0

嗯,我認爲從GWT的角度來看6和7之間沒有太大的區別。窗口小部件的使用方式相同。如果你想使用你自己的widgetset,你需要用GWT進行編譯,我想沒有其他辦法。 –

+0

我的目標是不使用「我自己的」組件集。我甚至沒有使用任何小部件/插件/插件。事實上,它的構件集和構建過程與第一次創建項目時的構造過程非常相似。我正在尋找的是將我的主項目中的widgetset分解爲它自己的項目,這樣我就可以在單獨的構建過程中運行widgetset。對於Vaadin,在這種情況下,無論您在哪裏編譯它,它都是相同的組件集,不是嗎?也許我誤解了你想告訴我的東西。在這種情況下,我很抱歉! – Roger