The main requirement for folder structure is based on on Tapestry but on the servlet specification. Web accessible files in a .war cannot but in the WEB-INF folder. Tapestry lets you put .tml files either in the the regular place for web accessible files or in the WEB-INF at the same location (folder/package) as the corresponding .class file.
How one chooses to layout a folder during dev is, for my money, 100% up to the developer. That said, there are certain layouts that work very well with certain tools. For example, I use Eclipse. I start with a "Dynamic Web Project" type, stick all the .tml files in the WebRoot folder, all the .java files in the src folder and everything works fine and I can launch the app without packaging a .war file. I can launch it via either Tomcat or Jetty too. HTH Michael Bernagou <[EMAIL PROTECTED]> wrote: I have something strange and it made me asking this question : What are the mandatory project tree elements? (sorry for my english I don't now how to write it differently). So, my project is : MyProject/src/papo.pages/[all pages such as Start.java and Start.properties] MyProject/src/papo.services/[ioc stuff] MyProject/webroot/[all template such as Start.tml and Start_fr.tml] But I have this error : java.lang.RuntimeException Page Start did not generate any markup when rendered. This could be because its template file could not be located, or because a render phase method in the page prevented rendering. **************** Start.tml: "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> Paper and Pen Online [input] t:value="login.password" /> Si vous n'avez pas encore de compte, crees-en un!! ${message} ******************* Start.java: package papo.pages; import org.apache.tapestry.annotations.ApplicationState; import org.apache.tapestry.annotations.InjectPage; import org.apache.tapestry.annotations.Persist; import org.apache.tapestry.ioc.annotations.Inject; import papo.data.Login; import papo.data.UserLite; import papo.exception.PapoException; import papo.model.User; import papo.services.ApplicationService; import papo.services.UserService; /** * Start page of application papo. */ public class Start { private static final String SUCCESS = "Home"; private static final String FAILURE = "Start"; @Persist private Login login; public Login getLogin() { return login; } public void setLogin(Login login) { this.login = login; } private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } @ApplicationState private User user; @InjectPage private Home home; @Inject private UserService userService; @Inject private ApplicationService applicationService; String onSuccess() { try { user = userService.getAuthenticatedUser(login.getLogin(), login.getPassword()); if (user != null) { home.setUser(user); UserLite userLite = new UserLite(user.getLogin()); applicationService.makeOnline(userLite); home.setUsers(applicationService.getUserList().getUserList()); } else { message = "Login ou Password inconnue. L'identification a échoué."; return FAILURE; } } catch (PapoException pe) { message = "La procedure d'identification a rencontré un probleme !!"; return null; } return SUCCESS; } } It didn't enter in Start.java (I put a debug point) because it was not able to "compile" or "find" the Start.tml. Usually, when it found a compilation problem, the error message explicitely explain where is the line in the template, but in my case, I have only a stack trace. When I see the Snapshot for the typicall project, there is something else as Project tree, and I don't want to follow the architecture. Having the webroot folder in the src/main and the java in the src/main/java is not logic for me. A web application is not defined like that usually, why to change the way? But this is another subject... -- Michael Bernagou Java Developper